MySQL Выберите строку A и строку B, если строка A существует - PullRequest
0 голосов
/ 07 мая 2019

У меня есть таблица с двумя столбцами, различные типы идентификаторов. Если конкретный идентификатор (2) находится во втором столбце (widget_id), я хочу получить список всех идентификаторов первого столбца в двух случаях:

  1. Если для идентификатора первого столбца есть также widget_id, равный 1,
  2. Если для идентификатора первого столбца не существует виджета с идентификатором 1.

В настоящее время у меня есть запрос, который захватывает все строки с widget_id 1 или 2. Как я могу сосредоточиться на том, что мне нужно?

Мой текущий запрос:

SELECT *
FROM db.table
WHERE (widget_id = 1 OR widget_id = 2)
ORDER BY gadget_id;

Выход:

+----------+----------+
|gadget_id |widget_id |
+----------+----------+
|100       |1         |
|101       |1         |
|101       |2         |
|102       |1         |
|103       |2         |
|104       |1         |
|104       |2         |
|105       |2         |
+----------+----------+

Вывод, который я ищу:

Оба # 1 и # 2:

+----------+----------+
|gadget_id |widget_id |
+----------+----------+
|101       |1         |
|101       |2         |
|104       |1         |
|104       |2         |
+----------+----------+

Только № 2:

+----------+----------+
|gadget_id |widget_id |
+----------+----------+
|103       |2         |
|105       |2         |
+----------+----------+

1 Ответ

1 голос
/ 07 мая 2019

В обоих случаях вам нужно group by gadget_id.
Для 1-го случая условие состоит в том, что оба 1 и 2 должны существовать:

select * from tablename 
where gadget_id in (
  select gadget_id
  from tablename
  where widget_id in (1, 2)
  group by gadget_id
  having count(distinct widget_id) = 2
) 

Для 2-го случая условие состоит в том, что 1 не должно существовать:

select * from tablename 
where gadget_id in (
  select gadget_id
  from tablename
  where widget_id in (1, 2)
  group by gadget_id
  having sum(widget_id = 1) = 0 
)

Если 1 и 2 являются единственными значениями в столбце widget_id, вы можете опустить условие:

where widget_id in (1, 2)

в обоих запросах.
См. демоверсию .
Результаты:

Запрос № 1

| gadget_id | widget_id |
| --------- | --------- |
| 101       | 1         |
| 101       | 2         |
| 104       | 1         |
| 104       | 2         |

Запрос № 2

| gadget_id | widget_id |
| --------- | --------- |
| 103       | 2         |
| 105       | 2         |
...