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>
+-----------+---------------------------------------------------------+---------------------+-----------+-----------------
问题在于最后两个结果(例如),它只返回两个消息,只有一个消息,只有一个消息,它为什么要做到最后两个结果。
答案 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
中的所有列都将在每一行上重复。
这正是内连接操作的设计方式。