Выберите запрос с двумя параметрами В (список)

#mysql #sql #select

Вопрос:

Используя следующую таблицу, как я могу написать один запрос MySQL, который извлекал бы строки из совпадающих пар?

Мне нужно захватить строки совпадающих пар ID/rID: [10,1002], [14,1003], [28,1001], [40,1002]

 myTable
ID    rID   rName
------------------
1     1001  ThisName
10    1002  ThatName ***
10    1001  SomeName
11    1001  OtherName
14    1003  NewName  ***
14    1001  CrazyName
21    1003  OldName
28    1001  GoodName ***
28    1002  SimpleName
31    1003  BadName
40    1002  GreatName  ***
50    1004  TerribleName
60    1001  BlahName
 

Строки с * * * — это те, которые я хочу извлечь. Я пытался выполнить следующий запрос

 SELECT * 
FROM myTable 
WHERE ID IN (10,14,28,40) AND rID IN (1001,1002,1003)
 

но это также возвращало пары [10,1001], [14,1001] и [28,1002].

Ответ №1:

Вы можете использовать in с кортежами:

 select t.*
from mytable t
where (id, rid) in ( (10, 1001), (14, 1003), (28, 1001), (40, 1002) );
 

Вы также можете выразить это с помощью явных сравнений:

 select t.*
from mytable t
where (id = 10 and rid = 1001) or
      (id = 14 and rid = 1003) or
      (id = 28 and rid = 1001) or
      (id = 40 and rid = 1002);
 

Комментарии:

1. @rolinger обратите внимание, что MySQL, похоже, не очень хорошо оптимизирует это

2. @Гордон Линофф — здорово! Спасибо…. Я не знал, что ты можешь это сделать. Это имя все же называется tuples ? Хм…