我有以下代码
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
的基础上 includes (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 ;
有什么想法吗?希望保持简单,并且不包含PHP脚本中的foreach检查
答案 0 :(得分:1)
我认为您要获取的代码与此相似:
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子句中,并将这些参数的计数放在having count语句的末尾。
这将意味着仅返回与参数数量匹配的结果。
我希望这会有所帮助!