MySQL отношение «многие ко многим» - измените ИЛИ ВЫБЕРИТЕ на «И» - PullRequest
0 голосов
/ 16 апреля 2019

У меня следующий код

SELECT DISTINCT t.`id_task` FROM crm_task t LEFT JOIN crm_task_tagtogroup asso USING (`id_task`) WHERE asso.id_tag IN(1,2,5,6)

Моя проблема в том, что он включает на OR основе, а не AND основе (Excldude работает нормально). Ищите эффективный способ изменить id_task IN () на AND.
Поэтому я получаю все записи, которым присвоены теги 1,2,5 и 6

Структура базы данных:



CREATE TABLE `crm_task_tagtogroup` (
`id_task`  INT UNSIGNED  , 
`id_tag`  INT UNSIGNED  , 
 UNIQUE KEY (`id_task`, `id_tag`)
) CHARACTER SET utf8 COLLATE utf8_general_ci ;

CREATE TABLE `crm_task` (
`id_task`  INT UNSIGNED   AUTO_INCREMENT PRIMARY KEY , 
`name`  VARCHAR(30), 
`description`  TEXT , 
`priority`  INT UNSIGNED  , 
`client_id`  INT UNSIGNED  , 
`value_netto`  INT UNSIGNED
) CHARACTER SET utf8 COLLATE utf8_general_ci ;


Есть идеи? Хотелось бы сохранить простоту и не включать проверку foreach в скрипте PHP

1 Ответ

1 голос
/ 16 апреля 2019

Я думаю, что код, который вы хотите получить, близок к этому:

SELECT DISTINCT t.`id_task` FROM crm_task t INNER JOIN crm_task_tagtogroup tag ON (id_tag in (1,2,3)) having count(distinct id_tag) = 3;

поместите ваш список параметров в предложении on и количество этих параметров в конце оператора имеющего count.

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...