2015-09-29 20 views
1

我有三個表將涉及一個查詢。這是查詢正在嘗試執行的操作:試圖在一個查詢中提取兩組不同的數據集

玩家創建交易報價。貿易提供的表結構是這樣:

id    int(11) 
sender   int(11) 
receiver  int(11) 
offer   text 
request   text 
active   tinyint(1) 
slot_upgrade int(11) 

當玩家外幣交易報價,他們城市從他們發送的交易存儲在sender領域的ID,以及目標的ID 城市他們發送交易存儲在receiver字段。

現在,當玩家登錄時,我想提取所有活躍的交易。

我有這樣的事情:

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)) 

該查詢會發現所有活動(積極意義的是,active tinyint(1)字段設置爲1)交易在cities_trades表。

它也將提取出發送方通過使用在cities_trades表關聯到在cities表中的城市ID的sender領域cities表做LEFT JOINuserid

通過這樣做,我可以從中提取cities表和users表的任何信息,爲業界創造者,或在這種情況下,發件人

但是,如果我也想拉取關於receiver的所有相同信息,而不僅僅是sender(我希望他們都有信息),我該怎麼做?

我能想到的唯一的另一個解決方案是通過在cities_trades表中添加兩個新字段來存儲其相關玩家ID,例如簡化查詢,而不僅僅是他們的城市id。

sender_player_id receiver_player_id

我希望這個問題是有道理的。謝謝。

回答

1

您可能實際上對cities表執行了兩次加入,每個交易的每一方都有一個加入。對cities_sendercities_receiver(或類似)使用不同的別名。您可以將它們全部列在SELECT中。

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)) 

編輯:增加了對用戶名發送者/接收者加入,以及...

+0

真棒!我不認爲兩次加入同一張桌子是可能的。真的很感謝快速和質量的迴應。 – josh

+0

@josh很高興幫助,祝你好運。只要您使用別名進行區分,您可以多次加入同一張表。 –

相關問題