sqlite — определение наличия нескольких записей в таблице с помощью одного запроса

#sqlite #pdo

#sqlite #pdo

Вопрос:

Я пытаюсь оптимизировать запрос sqlite (PHP-PDO), выполнив один запрос вместо множества запросов к одним и тем же данным. У меня есть таблица с простой структурой:

 word
-----
aaaa
bb
cccc
dddd
ffff
 

теперь у меня есть список слов aaaa, gg, ffff . Для каждого из них, если элемент существует в таблице, я возвращаю 1 или 0.

Можно ли сделать это с помощью одного запроса, который с вышеупомянутыми данными вернул бы что-то вроде:

 aaaa 1
gg 0
ffff 1
 

Заранее благодарю вас.

Ответ №1:

Вы можете сделать это с помощью EXISTS :

 WITH cte(word) AS (VALUES ('aaaa'), ('gg'), ('ffff'))
SELECT c.word, 
       EXISTS (SELECT 1 FROM tablename t WHERE t.word = c.word) exists_in_the_table
FROM cte c
 

или с LEFT помощью объединения:

 WITH cte(word) AS (VALUES ('aaaa'), ('gg'), ('ffff'))
SELECT DISTINCT c.word, t.word IS NOT NULL exists_in_the_table
FROM cte c LEFT JOIN tablename t
ON t.word = c.word
 

Если в таблице нет повторяющихся слов, которые вы можете удалить DISTINCT .

Смотрите демонстрацию.
Результаты:

 > word | exists_in_the_table
> :--- | ------------------:
> aaaa |                   1
> gg   |                   0
> ffff |                   1