![](/img/trans.png)
[英]Select [column a] from table where there are no instances of [column b = arbitrary value]
[英]Select from table where value in column A or column B
我正在處理電影數據庫,並且有一個鏈接表,因此可以將電影鏈接到其續集。 我已經編寫了以下查詢,以便可以返回鏈接表的任何列中的movie_id所在的續集列表,但是我想知道是否還有更好的方法可以這樣做,因為這似乎是一個漫長的過程打算嗎?
SELECT movie_id, movie_title FROM movies WHERE movie_id in
(SELECT movie_1 FROM lk_movies WHERE movie_1 = 1 or movie_2 = 1 or movie_3 = 1 or movie_4 = 1 or movie_5 = 1 or movie_6 = 1 or movie_7 = 1 or movie_8 = 1 or movie_9 = 1 or movie_10 = 1)
or movie_id in
(SELECT movie_2 FROM lk_movies WHERE movie_1 = 1 or movie_2 = 1 or movie_3 = 1 or movie_4 = 1 or movie_5 = 1 or movie_6 = 1 or movie_7 = 1 or movie_8 = 1 or movie_9 = 1 or movie_10 = 1)
or movie_id in
(SELECT movie_3 FROM lk_movies WHERE movie_1 = 1 or movie_2 = 1 or movie_3 = 1 or movie_4 = 1 or movie_5 = 1 or movie_6 = 1 or movie_7 = 1 or movie_8 = 1 or movie_9 = 1 or movie_10 = 1)
or movie_id in
(SELECT movie_4 FROM lk_movies WHERE movie_1 = 1 or movie_2 = 1 or movie_3 = 1 or movie_4 = 1 or movie_5 = 1 or movie_6 = 1 or movie_7 = 1 or movie_8 = 1 or movie_9 = 1 or movie_10 = 1)
or movie_id in
(SELECT movie_5 FROM lk_movies WHERE movie_1 = 1 or movie_2 = 1 or movie_3 = 1 or movie_4 = 1 or movie_5 = 1 or movie_6 = 1 or movie_7 = 1 or movie_8 = 1 or movie_9 = 1 or movie_10 = 1)
or movie_id in
(SELECT movie_6 FROM lk_movies WHERE movie_1 = 1 or movie_2 = 1 or movie_3 = 1 or movie_4 = 1 or movie_5 = 1 or movie_6 = 1 or movie_7 = 1 or movie_8 = 1 or movie_9 = 1 or movie_10 = 1)
or movie_id in
(SELECT movie_7 FROM lk_movies WHERE movie_1 = 1 or movie_2 = 1 or movie_3 = 1 or movie_4 = 1 or movie_5 = 1 or movie_6 = 1 or movie_7 = 1 or movie_8 = 1 or movie_9 = 1 or movie_10 = 1)
or movie_id in
(SELECT movie_8 FROM lk_movies WHERE movie_1 = 1 or movie_2 = 1 or movie_3 = 1 or movie_4 = 1 or movie_5 = 1 or movie_6 = 1 or movie_7 = 1 or movie_8 = 1 or movie_9 = 1 or movie_10 = 1)
or movie_id in
(SELECT movie_9 FROM lk_movies WHERE movie_1 = 1 or movie_2 = 1 or movie_3 = 1 or movie_4 = 1 or movie_5 = 1 or movie_6 = 1 or movie_7 = 1 or movie_8 = 1 or movie_9 = 1 or movie_10 = 1)
or movie_id in
(SELECT movie_10 FROM lk_movies WHERE movie_1 = 1 or movie_2 = 1 or movie_3 = 1 or movie_4 = 1 or movie_5 = 1 or movie_6 = 1 or movie_7 = 1 or movie_8 = 1 or movie_9 = 1 or movie_10 = 1);
不幸的是, Mysql
不支持Unpivot
或Cross Apply
運算符,因此這是我想出的最好的方法
子查詢
SELECT movie_1
FROM lk_movies
WHERE movie_1 = 1
OR movie_2 = 1
OR movie_3 = 1
OR movie_4 = 1
OR movie_5 = 1
OR movie_6 = 1
OR movie_7 = 1
OR movie_8 = 1
OR movie_9 = 1
OR movie_10 = 1
可以通過反轉IN
運算符來重寫
SELECT movie_10
FROM lk_movies
WHERE 1 IN( movie_1, movie_2, movie_3, movie_4,
movie_5, movie_6, movie_7, movie_8,
movie_9, movie_10 )
然后使用Union all
而不是多個OR
條件,這是完整的查詢
SELECT movie_id,
movie_title
FROM movies
WHERE movie_id IN (SELECT movie_1
FROM lk_movies
WHERE 1 IN( movie_1, movie_2, movie_3, movie_4,
movie_5, movie_6, movie_7, movie_8,
movie_9, movie_10 )
UNION ALL
SELECT movie_2
FROM lk_movies
WHERE 1 IN( movie_1, movie_2, movie_3, movie_4,
movie_5, movie_6, movie_7, movie_8,
movie_9, movie_10 )
UNION ALL
...............
...............
SELECT movie_10
FROM lk_movies
WHERE 1 IN( movie_1, movie_2, movie_3, movie_4,
movie_5, movie_6, movie_7, movie_8,
movie_9, movie_10 ))
當您創建帶有附加數字的列的表時,幾乎可以肯定您做錯了。 您的表未正確規范化 。
下面的所有代碼未經測試,因為我不使用mysql。 它可能有一些語法錯誤,但是您應該了解一下。
您可以創建一個這樣的表:
CREATE TABLE Movie
| ID | Title | ... | Sequel |
| 1 | Shrek | ... | 2 |
| 2 | Shrek 2 | ... | 3 |
| 3 | Shrek 3 | ... | NULL |
這樣,您將只知道下一個續集,並且必須必須遵循Sequel
列並指向下一個ID,直到您在Sequel
到達具有NULL
的Movie為止。
SELECT A.Titel, B.Titel AS Sequel
FROM Movie A
INNER JOIN Movie B
ON A.Sequel = B.ID
要在一個查詢中查找所有續集,請為該續集考慮一個單獨的表。 這也消除了對續集數量的限制。
Movie
| ID | Title | ... |
| 1 | Shrek | ... |
| 2 | Shrek 2 | ... |
| 3 | Shrek 3 | ... |
和
Sequel
| Movie_ID | Sequel_ID |
| 1 | 2 |
| 1 | 3 |
| 2 | 3 |
然后您可以從中選擇
SELECT Movie.Titel
FROM Movie
INNER JOIN Sequel
ON Movie.Movie_ID = Sequel.Sequel_ID
INNER JOIN Movie S
ON Sequel.Sequel_ID = S.Movie_ID
此處的缺點是您復制信息,即,您需要為Shrek存儲有Shrek 2和Shrek 3作為續集,而對於Shrek 2,您需要復制Shrek 3是Shrek 2的續集這一事實。 ,您總是只想從第一部電影中搜索。
請注意漢蘭達的特殊情況,它不能有后遺症。 只可以有一個人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.