@thisuserhatephp
Офлайн - losers Онлайн - lusers

Как правильно составить запрос с помощью IN() или AND?

Прежде чем изменить структуру таблицы и переписать все, я все же попытаю удачу и спрошу тут, возможно есть решение.

Есть таблица:

spoiler

CREATE TABLE `some_table` (
  `id` int(11) NOT NULL,
  `num` int(11) NOT NULL,
  `user_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



И с записями
(id, num, user_id),
(1, '676', '447'),
(2, '242', '666'),
(3, '878', '447'),
(4, '925', '447'),
(5, '242', '447'),


На сервер отправляется числа, например: 878, 925, 242.
Делаю запрос:
$id = implode(' , ', $_POST['num']);

$query = $db->prepare(' SELECT * FROM some_table WHERE num IN($id) ');
$query->execute();


выводим user_id и поучаем:

447 и 666

Возможно, Вам пока не понятно в чем проблема, постараюсь объяснить.

Мне нужно вывести только те user_id, где поле num совпадают все числа, то есть должно было вывести только user_id = 447.

у user_id - 666 есть только числа 242, а остальных - нет, и по этому и выводится.

Каким образом можно составить такой запрос, или же все переделывать ?
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
Первый пришедший в голову вариант:
SELECT user_id
FROM some_table 
WHERE num IN (878, 925, 242)
GROUP BY user_id
HAVING COUNT(DISTINCT num) = 3 -- 3 количество вариантов
;


MySQL fiddle

Вариант с JOIN:

SELECT some_table.user_id
FROM some_table 
JOIN some_table st1 ON st1.user_id = some_table.user_id AND st1.num = 925
JOIN some_table st2 ON st2.user_id = some_table.user_id AND st2.num = 242
WHERE some_table.num = 878
;


MariaDB fiddle

Вариант с GROUP_CONCAT (номера должны быть отсортированы):

SELECT user_id, GROUP_CONCAT(DISTINCT num ORDER BY num)
FROM some_table 
WHERE num IN (878,925,242)
GROUP BY user_id
HAVING GROUP_CONCAT(DISTINCT num) = '242,878,925'
;


MySQL 8.0 Fiddle
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы