如此简单的问题,但由于某种原因,我今天无法理解它。
我有两个实体:- title
和 product
分别命名为 tbl_title
和 tbl_product
。每个title
可以有许多products
。
产品表有一个名为unwanted
的字段,可以是 null
、 0
或 1
。
我希望根据所有product
(ALL) unwanted
设置为 1
的位置选择所有 title
。因此,换句话说,我希望根据所有满足特定条件的孩子来选择父母。因此,如果一个title
有一个product
是unwanted
但另一个不是,我不希望这个title
进入结果集。
当我尝试这个时,我脑海中得到的最多的是:
SELECT * FROM `tbl_title`
left join tbl_product on tbl_product.title_id = tbl_title.id
where tbl_product.unwanted = 1
group by tbl_title.id
这显然是行不通的。
那么如何编写这样的查询呢?
select * from tbl_title
where id not in (select title_id from tbl_product where unwanted = 0)
在英语中,此查询会消除具有所需产品的所有标题。
从风格的角度来看,最好将你的列称为wanted
,因为unwanted = 0
是wanted = 1
的双重否定。了解积极的一面总是更容易。
SELECT t.id
FROM `tbl_title` t
left join tbl_product p on p.title_id = t.id
group by t.id
having sum(p.unwanted = 0 or p.unwanted is null) = 0
尝试使用如下所示的子查询:
SELECT * FROM `tbl_title` AS t
WHERE EXISTS (SELECT 1 FROM products WHERE title_id = t.id AND unwanted = 1)
AND NOT EXISTS (SELECT 1 FROM products WHERE title_id = t.id AND (unwanted = 0 OR unwanted IS NULL))
仅适用于表中title
SELECT *
FROM `tbl_title` AS t
JOIN tbl_product AS v ON t.id = v.title_id
WHERE NOT EXISTS(
SELECT *
FROM tbl_product
WHERE (t.id = title_id)
AND (unwanted = 0 OR unwanted IS NULL)
GROUP BY t.id