Mysql 从表中选择A列或B列中的值

Mysql 从表中选择A列或B列中的值,mysql,sql,Mysql,Sql,我正在开发一个电影数据库,我有一个链接表,这样我就可以将电影链接到它们的续集。我已经编写了下面的查询,这样我就可以返回电影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 m

我正在开发一个电影数据库,我有一个链接表,这样我就可以将电影链接到它们的续集。我已经编写了下面的查询,这样我就可以返回电影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 ) 
然后使用UNIONALL而不是multiple OR condition这里是完整查询

 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   |
这样你就只知道下一部续集了,而且你必须跟随指向下一个ID的续集列,直到你看到一部续集中有空的电影

在一个查询中查找所有的续集,考虑一个单独的序列表。这也消除了对续集数量的限制

Movie
| ID | Title    | ... |
|  1 | Shrek    | ... |
|  2 | Shrek 2  | ... |
|  3 | Shrek 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
这里的缺点是您复制了信息,即,您需要为史莱克存储史莱克2和史莱克3作为续集,而对于史莱克2,您复制史莱克3是史莱克2续集的事实。当然,除非你总是只想从第一部电影开始搜索


注意Highlander的角落案例,它不能有续集。只能有一个。

你能更新表结构吗标准化是关键为什么lk_电影有这么多列?这听起来像是一个非常糟糕的数据结构。我建议您在对该数据库编写查询之前先修复数据模型。谁会从这种事情中受益?@草莓你所说的事情是什么意思?为此干杯。我稍微更改了movies表,添加了sequel\u ref列,允许我搜索该列,而不是每个列中的movie\u id。结果是:同样对于草莓,这也允许我在网页上自动填充一个列表,以显示电影记录的续集用户在选择电影id、电影标题上,其中续集参考来自lk_电影,其中1在电影1中,电影2,电影3,电影4,电影5,电影6,电影7,电影8,电影9,电影10;
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