Mysql 试图在一个查询中提取两组不同的数据
一个查询将涉及三个表。这就是查询试图执行的操作: 玩家创建交易报价。交易报价表结构如下所示:Mysql 试图在一个查询中提取两组不同的数据,mysql,Mysql,一个查询将涉及三个表。这就是查询试图执行的操作: 玩家创建交易报价。交易报价表结构如下所示: id int(11) sender int(11) receiver int(11) offer text request text active tinyint(1) slot_upgrade int(11) 当玩家创建交易报价时,他们发送交易的城市的ID存储在发送者字段中,他们发送
id int(11)
sender int(11)
receiver int(11)
offer text
request text
active tinyint(1)
slot_upgrade int(11)
当玩家创建交易报价时,他们发送交易的城市的ID存储在发送者字段中,他们发送交易的目标城市的ID存储在接收者字段中
现在当玩家登录时,我想提取所有活跃交易
我有这样的想法:
SELECT ct.id, ct.offer, ct.request, cities.name, cities.userid, cities.x, cities.y,users.username
FROM cities_trades AS ct
LEFT JOIN cities ON ct.sender = cities.id
LEFT JOIN users ON cities.id = users.id
WHERE ct.active = 1 AND (ct.sender IN (1,2) OR ct.receiver IN (1,2))
此查询将在cities\u trades
表中查找所有活动(活动意味着active tinyint(1)
字段设置为1)交易
它还将通过使用cities\u trades
表中与cities
表中的城市id相关的sender
字段,在cities
表上执行左连接
来提取发送者的用户id
通过这样做,我可以从cities
表和users
表中为交易创建者提取任何信息,或者在本例中为发送者提取任何信息
但是,如果我还想获取关于接收者
的所有相同信息,而不仅仅是发送者
(我想了解这两个方面的信息),我该怎么做呢
我能想到的唯一其他解决方案是简化查询,将两个新字段添加到cities\u trades
表中,以存储它们的相对玩家ID,例如,而不仅仅是它们的城市ID
sender\u player\u id
receiver\u player\u id
我希望这个问题有意义。谢谢。您实际上可以对cities
表执行两个联接,一个用于交易的每一方。为每个ascities\u发送方
和cities\u接收方
(或类似)使用不同的别名。然后,您可以在选择中列出它们
SELECT
ct.id,
ct.offer,
ct.request,
-- Specify all sender columns with an alias
cities_sender.name AS sender_name,
cities_sender.userid AS sender_userid,
cities_sender.x AS sender_x,
cities_sender.y AS sender_y,
-- Then specify all receiver columns with a different alias
cities_receiver.name AS receiver_name,
cities_receiver.userid AS receiver_userid,
cities_receiver.x AS receiver_x,
cities_receiver.y AS receiver_y,
-- Also for usernames on both sides of the relationship
users_sender.username AS sender_username,
users_receiver.username AS receiver_username
FROM
cities_trades AS ct
-- Join once for the sender side
LEFT JOIN cities AS cities_sender ON ct.sender = cities_sender.id
-- Join again for the receiver side
LEFT JOIN cities AS cities_receiver ON ct.receiver = cities_receiver.id
-- Likewise, for users
LEFT JOIN users users_sender ON cities_sender.id = users_sender.id
LEFT JOIN users users_receiver ON cities_receiver.id = users_receiver.id
WHERE
ct.active = 1
AND (ct.sender IN (1,2) OR ct.receiver IN (1,2))
编辑:还为用户名添加了发送者/接收者连接…Awesome!我不认为两次加入同一张桌子是可能的。非常感谢您的快速和高质量的响应。@josh很高兴能提供帮助,祝您好运。只要使用别名进行区分,就可以多次加入同一个表。