Mysql连接查询返回重复行

时间:2018-05-18 15:53:29

标签: mysql

SELECT m.*
     , p.image_url
     , r.acceptance_status
  from playermessage m
  join playerprofile p
    on p.player_id = m.sender_id 
  join requesttempstorage r
    on r.requester_id = m.sender_id  
 where m.player_id = 48

这个查询行为奇怪,它给了我两个重复的行,但是当我检查表playermessage时没有重复的行只有这个查询会向用户显示两次相同的消息,而只有一条消息可以任何人发现错误。

<小时/>

| player_id | player_message                                          | date_sent           | sender_id | image_url          | acceptance_status |<br>
+-----------+---------------------------------------------------------+---------<br>------------+-----------+--------------------+-------------------+<br>
|        48 | imran wants to be a part of the pakistan cricket team   | 2018-05-17 18:58:08 |        50 | uploads/imran.jpg  |                 1 |<br>
|        48 | fakhar wants to be a part of the pakistan cricket team  | 2018-05-17 19:13:27 |        51 | uploads/fakhar.jpg |                 1 |<br>
|        48 | shadab wants to be a part of the pakistan cricket team  | 2018-05-18 11:09:49 |        52 | uploads/shadab.jpg |                 1 |<br><strong>
|        48 | asif wants to be a part of the pakistan cricket team    | 2018-05-18 11:20:51 |        53 | uploads/asif.jpeg  |                 0 </strong>|<br>
<strong>|        48 | asif wants to be a part of the pakistan cricket team    | 2018-05-18 11:20:51 |        53 | uploads/asif.jpeg  |                 0 |</strong><br>
+-----------+---------------------------------------------------------+---------------------+-----------+-----------------

问题在于最后两个结果(例如),它只返回两个消息,只有一个消息,只有一个消息,它为什么要做到最后两个结果。

1 个答案:

答案 0 :(得分:0)

这两个查询中的一个将返回两行:

 SELECT p.* FROM playerprofile p WHERE p.player_id = 53 

 SELECT r.* FROM requesttempstorage r WHERE r.requester_id = 53 

JOIN操作是找到所有匹配的行,并返回所有这些行。

如果playermessage中有一行sender_id = 53

如果playerprofile中有player_id = 53两个行,那么我们希望返回两个行。

如果我们在playerprofile中使用player_id = 53包含三个行,则连接操作将返回三个行。

如果我们playerprofile中的{em>零行有player_id = 53,那么我们将不会从playermessage返回sender_id = 53行的任何行。

如果我们在requesttempstorage中有两行requester_id = 53,那么返回的行数。

playermessage中的所有列都将在每一行上重复。

这正是内连接操作的设计方式。