2017-10-08 113 views
0

我想編寫一個查詢數據庫SQL查詢卡

我一定要找到誰租了「喜劇」的電影,但還沒有租「劇」電影的客戶名稱。 我寫下面的查詢,但我沒有得到正確的結果。我認爲沒有租用「戲劇」部分不工作在我的查詢。

SELECT DISTINCT CONCAT(customer.first_name,' ',customer.last_name) as Name 
FROM rental 
JOIN inventory ON rental.inventory_id=inventory.inventory_id 
JOIN customer ON rental.customer_id=customer.customer_id 
JOIN film ON film.film_id=inventory.film_id 
JOIN film_category ON film_category.film_id=film.film_id 
WHERE film_category.category_id=5 and 
     film_category.category_id<>7 
ORDER by Name; 

任何想法有什麼不對?

+1

請不要破壞你的帖子。 – EJoshuaS

+0

更糟的是,你有幾個合理的答案。 – EJoshuaS

回答

0

此查詢返回每次租賃的行,其中category_id是5,而不是7 - 這是因爲5冗餘條件顯然不7.

一個簡單的方式來處理這種問題是計數行數,每個客戶與category_id小號5秒和7秒的:

SELECT CONCAT(customer.first_name,' ',customer.last_name) as Name 
FROM  rental 
JOIN  inventory ON rental.inventory_id=inventory.inventory_id 
JOIN  customer ON rental.customer_id=customer.customer_id 
JOIN  film ON film.film_id=inventory.film_id 
JOIN  film_category ON film_category.film_id=film.film_id 
GROUP BY customer.first_name, customer.last_name 
HAVING COUNT(CASE film_category.category_id WHEN 5 THEN 1 END) > 0 AND 
     COUNT(CASE film_category.category_id WHEN 7 THEN 1 END) = 0 
ORDER BY 1; 
+0

非常感謝@Mureinik如果我需要查找返回的行數。就像在這個例子中count是78.我應該如何改變select語句呢?所以我只輸出爲78,而不是他們的名字或ID的 – Kevin

+0

你可以用另一個查詢包裝它:'SELECT COUNT(*)FROM(SELECT ...' – Mureinik

0

你應該開始在一組的方式思考。讓我們有一組A作爲租用'喜劇'和設置B租用'戲劇'的客戶的一組客戶。然後,你只需要一個 - B.它可以寫在MySQL的使用NOT IN例如:

SELECT DISTINCT CONCAT(customer.first_name,' ',customer.last_name) as Name 
FROM customer 
WHERE customer.customer_id IN (
    SELECT rental.customer_id 
    FROM rental 
    JOIN inventory ON rental.inventory_id=inventory.inventory_id 
    JOIN film ON film.film_id=inventory.film_id 
    JOIN film_category ON film_category.film_id=film.film_id 
    WHERE film_category.category_id=5 
) AND 
     customer.customer_id NOT IN (
    SELECT rental.customer_id 
    FROM rental 
    JOIN inventory ON rental.inventory_id=inventory.inventory_id 
    JOIN film ON film.film_id=inventory.film_id 
    JOIN film_category ON film_category.film_id=film.film_id 
    WHERE film_category.category_id=7 
) 

請注意,如果你沒有在NULLrental.customer_id這個查詢會工作。

1

正如前面在其他答案中所提到的,5不是7,但在使用DISTINCT時還需要小心,因爲可能有兩個具有相同名稱的客戶,請使用group by子句。

解決這個問題的最好方法是根據數據庫大小和正在運行的MySQL版本的子查詢,CTE或臨時表。這些對於MySQL來說是最少的工作,並且應該以最快的方式返回結果集。

您的10起動器是一個子查詢:

SELECT CONCAT(customer.first_name,' ',customer.last_name) as Name 
FROM rental 
JOIN inventory ON rental.inventory_id=inventory.inventory_id 
JOIN customer ON rental.customer_id=customer.customer_id 
JOIN film ON film.film_id=inventory.film_id 
JOIN film_category ON film_category.film_id=film.film_id 
LEFT JOIN ( 
    SELECT customer.customer_id 
    FROM rental 
    JOIN inventory ON rental.inventory_id=inventory.inventory_id 
    JOIN customer ON rental.customer_id=customer.customer_id 
    JOIN film ON film.film_id=inventory.film_id 
    JOIN film_category ON film_category.film_id=film.film_id 
    WHERE film_category.category_id=7 
    GROUP BY customer.customer_id 
) as DRAMA 
ON DRAMA.customer_id=customer.customer_id 
WHERE film_category.category_id=5 AND 
DRAMA.customer_id is NULL 
GROUP BY customer.customer_id 
ORDER by Name; 

基本上我們這裏做的是形成兩組數據和剛剛從集合A中不與集合B的重疊客戶