在不同的表上连接两个相似的查询-MySQL或
我在MySQL查询方面遇到了问题,我是个新手,所以对我放松点!。我有一个网站与电视节目,并希望选择两个日期之间播出的剧集没有问题,根据两个不同的行动为自定义时间表。基本上,如果用户正在关注uses\u follow\u shows或者正在观看用户所观看的节目,我想我应该像下面那样在用户所观看的节目中进行查询,但这不起作用,我得到的是1200行,而不是3行,它从用户所观看的节目中获取所有现有的行 我原以为这句话可以做到,但事实并非如此,我也不明白为什么在不同的表上连接两个相似的查询-MySQL或,mysql,Mysql,我在MySQL查询方面遇到了问题,我是个新手,所以对我放松点!。我有一个网站与电视节目,并希望选择两个日期之间播出的剧集没有问题,根据两个不同的行动为自定义时间表。基本上,如果用户正在关注uses\u follow\u shows或者正在观看用户所观看的节目,我想我应该像下面那样在用户所观看的节目中进行查询,但这不起作用,我得到的是1200行,而不是3行,它从用户所观看的节目中获取所有现有的行 我原以为这句话可以做到,但事实并非如此,我也不明白为什么 SELECT * FROM show_epi
SELECT * FROM show_episode_airdate, show_episode, show_network, network, shows, users_follow_shows, user_watched
WHERE show_episode_airdate.airdate BETWEEN '2013-07-20' AND '2013-07-27'
AND ( show_episode.episode_id = show_episode_airdate.episode_id
AND shows.id = show_network.show_id
AND show_network.network_id = network.network_id
AND show_episode.imdb_id_show = shows.imdb_id
AND users_follow_shows.user_id = 2 AND shows.id = users_follow_shows.show_id
OR user_watched.user_id = 2
AND shows.id = user_watched.show_id
AND show_episode.episode_id = show_episode_airdate.episode_id
AND shows.id = show_network.show_id
AND show_network.network_id = network.network_id
AND show_episode.imdb_id_show = shows.imdb_id )
ORDER by network.network_id ASC
谁能告诉我怎么了
谢谢
编辑:
例如,如果这是您的目标,您需要提出以下条件:
SELECT * FROM show_episode_airdate, show_episode, show_network, network, shows, users_follow_shows, user_watched
WHERE show_episode_airdate.airdate BETWEEN '2013-07-20' AND '2013-07-27'
AND ( (show_episode.episode_id = show_episode_airdate.episode_id
AND shows.id = show_network.show_id
AND show_network.network_id = network.network_id
AND show_episode.imdb_id_show = shows.imdb_id
AND users_follow_shows.user_id = 2
AND shows.id = users_follow_shows.show_id)
OR (user_watched.user_id = 2
AND shows.id = user_watched.show_id
AND show_episode.episode_id = show_episode_airdate.episode_id
AND shows.id = show_network.show_id
AND show_network.network_id = network.network_id
AND show_episode.imdb_id_show = shows.imdb_id ) )
ORDER by network.network_id ASC
所以你会得到:如果在日期和第一个条件或第二个条件之间
我建议您使用JOIN/internaljoin,因为您在where子句中使用了OR条件,所以我在所有这些AND:D中迷失了方向。为联合收割机条件提供适当的参数 只需尝试以下查询
SELECT * FROM show_episode_airdate, show_episode, show_network, network, shows, users_follow_shows, user_watched
WHERE show_episode_airdate.airdate BETWEEN '2013-07-20' AND '2013-07-27'
AND (( show_episode.episode_id = show_episode_airdate.episode_id
AND shows.id = show_network.show_id
AND show_network.network_id = network.network_id
AND show_episode.imdb_id_show = shows.imdb_id
AND users_follow_shows.user_id = 2 AND shows.id = users_follow_shows.show_id )
OR (user_watched.user_id = 2
AND shows.id = user_watched.show_id
AND show_episode.episode_id = show_episode_airdate.episode_id
AND shows.id = show_network.show_id
AND show_network.network_id = network.network_id
AND show_episode.imdb_id_show = shows.imdb_id ))
ORDER by network.network_id ASC
如果使用正确的连接语法编写,那么逻辑问题就会消失。结果如下所示:
SELECT *
FROM show_episode_airdate join
show_episode
on show_episode.episode_id = show_episode_airdate.episode_id join
show_network
on show_network.show_id = network.show_id join <------- THIS IS NOT IN YOUR ORIGINAL LIST
network
on show_network.network_id = network.network_id join
user_follows_shows
on shows.id = users_follow_shows.show_id join
user_watched
on shows.id = user_watched.show_id
WHERE show_episode_airdate.airdate BETWEEN '2013-07-20' AND '2013-07-27' and
(users_follow_shows.user_id = 2 or
user_watched.user_id = 2
)
ORDER by network.network_id ASC;
*应该被你真正想要的列所取代-只有当你避开用户关注的节目和用户关注的列时,distinct才会起作用。左侧外部连接意味着将考虑所有显示
另一种编写方法是编写一个子查询来组合关注的和关注的节目,这种方法不需要在select子句中使用distinct。这将删除重复项,如下所示:
SELECT *
FROM show_episode_airdate join
show_episode
on show_episode.episode_id = show_episode_airdate.episode_id join
shows
on shows.imdb_id = show_episode.imdb_id_show join
show_network
on show_network.show_id = shows.id join
network
on show_network.network_id = network.network_id join
(select show_id, user_id
from users_follow_shows
union
select show_id, user_id
from user_watched
) watch_or_follow
on shows.id = watch_or_follow.show_id
WHERE show_episode_airdate.airdate BETWEEN '2013-07-20' AND '2013-07-27' and
watch_or_follow.user_id = 2
ORDER by network.network_id ASC;
仍然返回1200行。我认为这是因为在第一个或第二个选项中,它选择了用户观看的所有内容,而在第二个选项中,选择了用户关注的所有内容。。。不?我认为@Gordon Linoff解释它的最好方式是:D+费心去写整件事,所以读起来:DI get this error Unknown column“shows.id”in“on子句”中的列确实存在。我以前没有使用过join和on,where和and的逻辑对我来说更有意义。但这已经不是第一次有人提到我应该使用它了,所以我一定会努力理解它。@metareviewr。您是如何学习SQL而不是学习正确的语法的?你需要找到能更好地教授你所需知识的书籍/讲师/在线材料。您的查询缺少一个非常重要的连接条件。几乎不可能发现您编写连接的方式。当使用正确的语法时,这是微不足道的。我在实践中学习。我学到的大部分东西都是在Stackoverflow上学到的。不管怎样,我得到了join and on的原理,并重新制作了上面的查询(参见原始帖子),但仍然不起作用。它只从观看的节目中获取剧集,而不是随后的剧集。我也有重复的行。
SELECT distinct *
FROM show_episode_airdate join
show_episode
on show_episode.episode_id = show_episode_airdate.episode_id join
shows
on shows.imdb_id = show_episode.imdb_id_show join
show_network
on show_network.show_id = shows.id join
network
on show_network.network_id = network.network_id left outer join
users_follow_shows
on shows.id = users_follow_shows.show_id left outer join
user_watched
on shows.id = user_watched.show_id
WHERE show_episode_airdate.airdate BETWEEN '2013-07-20' AND '2013-07-27' and
(users_follow_shows.user_id = 2 or
user_watched.user_id = 2
)
ORDER by network.network_id ASC;
SELECT *
FROM show_episode_airdate join
show_episode
on show_episode.episode_id = show_episode_airdate.episode_id join
shows
on shows.imdb_id = show_episode.imdb_id_show join
show_network
on show_network.show_id = shows.id join
network
on show_network.network_id = network.network_id join
(select show_id, user_id
from users_follow_shows
union
select show_id, user_id
from user_watched
) watch_or_follow
on shows.id = watch_or_follow.show_id
WHERE show_episode_airdate.airdate BETWEEN '2013-07-20' AND '2013-07-27' and
watch_or_follow.user_id = 2
ORDER by network.network_id ASC;