2012-11-12 2 views
2

이것은 아주 간단한 문제입니다. 그러나 어떤 이유로 오늘 나는 그것을 감당할 수 없습니다.모든 자녀들의 상태를 기준으로 부모를 선택하십시오

두 엔터티가 각각 tbl_titletbl_producttitleproduct입니다. 각 title에는 products이 많이있을 수 있습니다.

이 제품 테이블이 될 수 unwanted라는 필드가 하나 null, 0 또는 1.

나는 모든 product의 (ALL)이 1unwanted 세트가 위치에 따라 모든 title의를 선택하고 싶습니다. 즉, 나는 어떤 조건을 채우는 모든 아이들을 기반으로 부모를 선택하고 싶습니다. 따라서 titleproduct이 있는데 그 중 하나가 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 

.

그래서 어떻게 이러한 쿼리를 코딩합니까?

+0

설명이 사용자의 제목과 다릅니다. 모든 어린이에게 조건 또는 단 하나만 있어야합니까? –

+0

@juergend 모든 어린이는 제목과 설명에 "all"이라고 대답합니다. – Sammaye

+0

'제목에 원하지 않는 제품이 하나 있지만이 제목에 결과 집합. 그게 무슨 뜻이야? –

답변

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

title 테이블이 쿼리는 원하는이있는 모든 타이틀을 제거 생성물. 보기의 스타일 관점에서


, unwanted = 0wanted = 1의 이중 부정이기 때문에, 당신의 열 wanted 전화 좋을 것이다. 항상 긍정적 인 자세를 취하는 것이 더 쉽습니다.

+0

하나의 제목 ID에 원하지 않는 제품과 원하는 제품이 모두있는 경우 sub select에서 title_id를 반환하지 않으므로이 테스트가 필요합니다. – Sammaye

+0

@Sammaye 아니요. '원치 않는 항목 = 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'를 이해하지 못하는 사람이 이것을 downvoted했습니다. 이것은 효과가 있으며 잘못된 것은 없습니다. 카운터에 +1 – nawfal

+0

+1. 또한 차이가 없기 때문에 내부 선택 안에'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

HAVING을 사용하여 문제를 해결하려면 +1하십시오. 좋은. – davidethell

0

을 그냥 필드에

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

나는 이것이 여전히 subselect가 부정확 한 결과를 가져올 것 인 Kaii의 대답과 같은 문제를 안고 있다고 생각한다. 그것들은 원하지 않는 하나의 제품만을 가지고 있지만 다중 제품에서는 작동하지 않는 타이틀을 위해 작동 할 것입니다. – Sammaye

+0

@Sammaye 나는 틀린 약간의 이해를 추측한다. 나는 이것을 지금 시험해 보았다. 시도해 보았 니? – nawfal

+0

@Sammaye 당신 말이 맞아요. 이것은 원치 않는 기록을 가져 오지만 잘못 말한 것입니다. 내가 이것을 고치면 그것은 exaclty가 될 것입니다. 왜냐하면 davidethell의 대답이 – nawfal

관련 문제