MySQL, поиск одинаковых столбцов в нескольких строках - PullRequest
0 голосов
/ 01 ноября 2018

Допустим, у нас есть следующая таблица:

|--------|-------------|------------|------------|------------|------------|
| 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. Invalid: у него есть только одна из указанных комбинаций.
  4. Неверно: в нем есть необходимое количество строк, но вторая комбинация данных неверна из-за столбца tbl_data_c.

Таким образом, результат должен содержать идентификаторы 1 и 2.


Спасибо всем.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

В 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;

Предполагается, что в вашей таблице нет дубликатов.

0 голосов
/ 01 ноября 2018
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'
0 голосов
/ 01 ноября 2018

Попробуйте следующее:

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') 
...