【问题标题】:Mysqli fetch multiple distinct values from rows where given value is in any columnMysqli 从给定值在任何列中的行中获取多个不同的值
【发布时间】:2019-10-04 15:49:21
【问题描述】:

我有一个这样的数据表。更贴切的数据描述。

col0  |  col1 |  col2  |  col3  | col4
======================================
milk  | egg   | juice  |        |
egg   | juice |        |        |
bread | jam   | juice  |        |
wheat | egg   | juice  |        |
jam   | juice |        |        |

我想首先在所有列中搜索 Juice 并获取找到 juice 的所有行。然后我必须获取具有最独特和完整数据的行。在这种情况下,它是第一行,因为它具有最独特和最完整的数据集,没有重复的单词。所以,如果我从这些数据中搜索“果汁”,那么我想要这个结果

 milk  | egg   | juice  |
 bread | jam   | juice  |
 wheat | egg   | juice  |

我已尝试在所有列组合上使用 GROUP BYDISTINCT,但我无法获得所需的结果。 我用了这个说法

SELECT * FROM `table` 
WHERE `col4` = 'juice' OR`col3` = 'juice' OR `col2` = 'juice' OR `col1` = 'juice' 
group by `col2`,`col1`,`col0`;

我更希望它出现在一个语句中,而不是单独的语句中。

【问题讨论】:

  • 如果有不止一行具有相同计数的大多数唯一值怎么办?在这种情况下,你会如何决定抢七局?
  • 如果您将列级数据存储在行中,这可能会更容易。 stackoverflow.com/questions/8868395/sql-multi-valued-attributes
  • @MadhurBhaiya 我正在使用的实际数据不允许这样做。数据的模式与显示的数据相似。
  • @user2649343 多列中是否存在重复值?还是所有的值都是唯一的?此外,当没有值时,它表示为一个空字符串?或NULL ?
  • 这种问题表明设计不佳。考虑修改您的架构。

标签: mysql mariadb distinct


【解决方案1】:

您可以使用GROUP_CONCAT 函数。

它从组中返回一个具有串联非空值的字符串。

【讨论】:

  • 你能举一个关于我的查询的例子吗?
【解决方案2】:

如果您总是在较高的列号中拥有“最完整的数据”(col4 > col3 等),

你可以简单地将LIMIT结果转为1

SELECT * FROM `table` 
WHERE `col4` = 'juice' OR`col3` = 'juice' OR `col2` = 'juice' OR `col1` = 'juice'
LIMIT 1;

【讨论】:

    【解决方案3】:

    如果多个列之间没有重复值,并且空列使用NULL表示,那么我们可以利用 MySQL 将 boolean 隐式类型转换为 int:

    SELECT * 
    FROM your_table 
    WHERE 'juice' IN (col1, col2, col3, col4) 
    ORDER BY ( (col1 IS NOT NULL) + 
               (col2 IS NOT NULL) +
               (col3 IS NOT NULL) +
               (col4 IS NOT NULL) ) DESC
    LIMIT 1
    

    结果

    | col0 | col1 | col2  | col3 | col4 |
    | ---- | ---- | ----- | ---- | ---- |
    | milk | egg  | juice |      |      |
    

    View on DB Fiddle

    【讨论】:

    • 这是一种可以掩盖更深层次设计问题的膏药。
    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 2015-09-19
    • 2016-04-19
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多