Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 试图在一个查询中提取两组不同的数据_Mysql - Fatal编程技术网

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
表执行两个联接,一个用于交易的每一方。为每个as
cities\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很高兴能提供帮助,祝您好运。只要使用别名进行区分,就可以多次加入同一个表。