Mysql - 避免交叉连接以获取多个重复数据

时间:2014-12-07 22:09:19

标签: php mysql join cross-join

我有两个表,我希望在没有交叉连接的情况下获得结果以获取重复数据。

表1: booksCheckedOut

row    |   userID   |      book    |  date
-------------------------------------------------
1      |    3       |      book1   |  Jan-26
2      |    3       |      book2   |  Jan-27
3      |    3       |      book3   |  Jan-28
4      |    3       |      book4   |  Jan-29

表2:numberOfPagesRead

row     |    userID   |     name        |   date       |   pagesRead
-----------------------------------------------------------------
1       |    3        |     John        |   Jan-26     |   4
2       |    3        |     John        |   Jan-27     |   7
3       |    3        |     John        |   Jan-28     |   8

我正在做一个如下所示的SQL查询:

select booksCheckedOut.book, numberOfPagesRead.pagesRead

from booksCheckedOut, numberOfPagesRead

where booksCheckedOut.userID='3' and numberOfPagesRead.userID='3'

但我得到的结果如下:行正在成倍增加(4 x 3 = 12个结果)

book       |  pagesRead |     
-------------------------
book1      |    4       |      
book1      |    7       |     
book1      |    8       |     
book2      |    4       |
book2      |    7       |  
book2      |    8       |  
book3      |    4       |
book3      |    7       |   
book3      |    8       |   
book4      |    4       |   
book4      |    7       |   
book4      |    8       |         

这就是我想要的:

book       |  pagesRead |     
-------------------------
book1      |    4       |      
book2      |    7       |     
book3      |    8       |     
book4      |            |

如何防止结果成倍增加(交叉加入)?

我知道这没有意义,但我不想将阅读的页数与特定的书籍联系起来,这只是当前数据库的设置方式。

提前致谢!

1 个答案:

答案 0 :(得分:2)

UserIddate似乎是加入这些表格的关键:

select co.book, nopr.pagesRead
from booksCheckedOut co join
     numberOfPagesRead nopr
     on co.userId = nopr.UserId and co.date = nopr.date
where co.userID = '3';

您应该学习正确的join语法。一个简单的规则:从不from子句中使用逗号。

我添加了表别名; make查询更容易编写和阅读。