2012-11-12 80 views
2

这是一个如此简单的问题,但由于某种原因,今天我无法把头转向它。根据所有孩子的身体状况选择父母

我有两个实体: - titleproduct,每个分别命名为tbl_titletbl_product。每个title可以有许多products

该产品表有一个名为unwanted的字段,该字段可以是null01

我要选择的基础上,所有product S(ALL)有unwanted设置为1所有title秒。所以换句话说,我希望根据所有满足特定条件的孩子选择父母。所以如果一个title有一个productunwanted但另一个不是我不希望这个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 

这显然是行不通的。

那么如何编码这样的查询?

+0

你的描述与你的标题不同。如果所有的孩子都有条件或者只有一个 –

+0

@juergend所有描述标题和描述中的“全部”的孩子 – Sammaye

+0

'所以如果一个标题有一个不想要的产品,但另一个不是,我希望这个标题进入结果集。“这是什么意思? –

回答

2
select * from tbl_title 
where id not in (select title_id from tbl_product where unwanted = 0) 

在英语中,这个查询消除了有希望所有冠军产品。


从外观风格来看,这将是更好打电话给你列wanted,因为unwanted = 0wanted = 1双负。让你的头脑保持积极乐观总是更容易。

+0

我需要测试这个,因为如果一个标题ID同时包含不需要的产品和想要的产品,它会不会从子选择中返回title_id? – Sammaye

+0

@Sammaye号码任何'unwanted = 0'的出现都会导致该标题不被选择。然而,该查询将返回没有任何产品的标题。如果这不是你的意图,请告诉我 - 它可以很容易地修复 – Bohemian

+0

的确,因为当然你正在继续title_id,我没有看到,经过一些调整和测试后,它似乎返回了比上面的答案多7个结果,我将需要测试这一点,并找出哪个是最好的,谢谢:) – Sammaye

1

尝试使用子查询是这样的:

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)) 
+0

有人不明白'EXISTS'已经低估了这一点。这有效,没有错。 – nawfal

+0

+1给柜台。你也可以在内部select中使用'*'而不是'1',因为它没有区别。 – nawfal

+0

虽然比juergen的答案慢了许多(而且重得多),但它确实返回了相同的结果。 – Sammaye

2
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 
+0

啊哈,现在这是一个有趣的回应,谢谢! – Sammaye

+0

+1使用HAVING来解决问题。尼斯。 – davidethell

0

只为字段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 
+0

我认为这仍然会遇到与Kaii的回答相同的问题,即子查询会带来不正确的结果。它适用于只有一种不需要的产品的标题,但它不适用于多个产品。 – Sammaye

+0

@Sammaye我猜想一些错误的理解。我现在测试了它,它工作。你试过了吗? – nawfal

+0

@Sammaye你说得对,这会带来不必要的记录,但你错误地表述了它。我会删除这个,因为如果我纠正这个问题,它将变得非常残忍davidethell的回答 – nawfal