【问题标题】:MySQL, Search for same columns in multiple rowsMySQL,在多行中搜索相同的列
【发布时间】:2018-11-01 12:27:44
【问题描述】:

假设我们有下表:

|--------|-------------|------------|------------|------------|------------|
| tbl_id | tbl_item_id | tbl_data_a | tbl_data_b | tbl_data_c | tbl_data_d |
|--------|-------------|------------|------------|------------|------------|
|      1 |           1 |         a1 |         b1 |         c1 |         d1 |
|      2 |           1 |         a2 |         b2 |         c2 |         d2 |
|      3 |           1 |         a3 |         b3 |         c3 |         d3 |
|      4 |           2 |         a1 |         b1 |         c1 |         d1 |
|      5 |           2 |         a2 |         b2 |         c2 |         d2 |
|      6 |           3 |         a1 |         b1 |         c1 |         d1 |
|      7 |           4 |         a1 |         b1 |         c1 |         d1 |
|      8 |           4 |         a2 |         b2 |        c22 |         d2 |
|--------|-------------|------------|------------|------------|------------|

我们如何获得 tbl_item_id,它包含所有提供的行的所有正确列数据?


例如,我们在 php 中有以下数据数组:
$arData = [
  [a1, b1, c1, d1],
  [a2, b2, c2, d2]
];

对于这些数据,我们为每个 tbl_item_id 提供以下数据:

  1. 有效:它具有每个给定行的所有正确数据组合(还有更多,但我们不介意)。
  2. 有效:它具有每个给定行的所有正确数据组合。
  3. 无效:它只有一个给定的组合。
  4. 无效:它具有所需的行数,但由于列 tbl_data_c,第二个数据组合错误。

所以结果必须包含 ids 1 和 2。


谢谢你们。

【问题讨论】:

  • 结果不应该是tbl_item_id = 2吗? tbl_item_id = 1 是断点 1 和 2 ,因为您有一行 tbl_id = 3 不满足任何给定的组合

标签: mysql sql multiple-columns


【解决方案1】:

在 MySQL 中,您可以将查询构造为:

SELECT tbl_item_id 
FROM t 
WHERE (tbl_data_a, tbl_data_b, tbl_data_c, tbl_data_d) IN 
        ( ('a1', 'b1', 'c1', 'd1'), ('a2', 'b2', 'c2', 'd2') )
GROUP BY tbl_item_id 
HAVING COUNT(*) = 2;

这假设您的表没有重复。

【讨论】:

    【解决方案2】:

    尝试以下方法:

    SELECT tbl_item_id 
    FROM your_table 
    GROUP BY tbl_item_id 
    HAVING 
      SUM(tbl_data_a = 'a1' AND tbl_data_b = 'b1' AND tbl_data_c = 'c1' AND tbl_data_d = 'd1') 
    AND 
      SUM(tbl_data_a = 'a2' AND tbl_data_b = 'b2' AND tbl_data_c = 'c2' AND tbl_data_d = 'd2') 
    

    【讨论】:

    • 这和戈登的回答一样有效,但不幸的是我只能将一个标记为正确。非常感谢!
    • @Thanasis 别担心,请更新问题,因为正确答案只有item_id = 1
    • 不,我们不介意额外的行。 1 和 2 都是正确的。
    【解决方案3】:
    select yt1.tbl_item_id from your_table yt1
    inner join your_table yt2 on yt1.tbl_item_id = yt2.tbl_item_id
    where yt1.tbl_data_a = 'a1' and yt1.tbl_data_b = 'b1' and yt1.tbl_data_c = 'c1' and yt1.tbl_data_d = 'd1'
    and yt2.tbl_data_a = 'a2' and yt2.tbl_data_b = 'b2' and yt2.tbl_data_c = 'c2' and yt2.tbl_data_d = 'd2'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多