在不同的表上连接两个相似的查询-MySQL或

在不同的表上连接两个相似的查询-MySQL或,mysql,Mysql,我在MySQL查询方面遇到了问题,我是个新手,所以对我放松点!。我有一个网站与电视节目,并希望选择两个日期之间播出的剧集没有问题,根据两个不同的行动为自定义时间表。基本上,如果用户正在关注uses\u follow\u shows或者正在观看用户所观看的节目,我想我应该像下面那样在用户所观看的节目中进行查询,但这不起作用,我得到的是1200行,而不是3行,它从用户所观看的节目中获取所有现有的行 我原以为这句话可以做到,但事实并非如此,我也不明白为什么 SELECT * FROM show_epi

我在MySQL查询方面遇到了问题,我是个新手,所以对我放松点!。我有一个网站与电视节目,并希望选择两个日期之间播出的剧集没有问题,根据两个不同的行动为自定义时间表。基本上,如果用户正在关注uses\u follow\u shows或者正在观看用户所观看的节目,我想我应该像下面那样在用户所观看的节目中进行查询,但这不起作用,我得到的是1200行,而不是3行,它从用户所观看的节目中获取所有现有的行

我原以为这句话可以做到,但事实并非如此,我也不明白为什么

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;