Mysql 从表中选择A列或B列中的值
我正在开发一个电影数据库,我有一个链接表,这样我就可以将电影链接到它们的续集。我已经编写了下面的查询,这样我就可以返回电影id在链接表的任何列中的续集列表,但是我想知道是否有更好的方法来实现这一点,因为这似乎是一个相当冗长的方法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
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