2013-12-12 119 views
2

我一直在嘗試在過去的幾天裏完成這個MySQL查詢,現在運行得很少。我想將這些多個表格和它們的列組合起來,然後按照它們的共同點(不是按名稱,而是按內容)排序。我有以下的數據庫表:結合多個獨特的MySQL表格並按一列排序

mb_bans:
mb_bans

mb_ban_records:
mb_ban_records

mb_kicks:
mb_kicks

mb_mutes:
mb_mutes

mb_mutes_records:
mb_mutes_records

mb_warnings:
mb_warnings

我試圖做到的是這一行中的東西:
End Result

不幸的是,我以後難倒如何將這些MySQL表組合在一起,同時將它們保存在不同的類別中 - 按每個表中的_time列排序。我會如何處理這個問題?我一直沒有成功地嘗試檢索它們。我能得到的最接近的結果是將每個列的_time列組合在一起,然後在查詢中給它一個值作爲「日期」的值,但是我無法對結果做很多工作。我仍然需要將它作爲單獨的行來調用,對嗎?我大概可以用使用fetchall但後來我將無法添加任何東西的價值..

$banq = $db->prepare('SELECT banned, banned_by, ban_reason, ban_time, ban_expires_on FROM '.BAN_TABLE.' ORDER BY ban_time DESC'); 
$kickq = $db->prepare('SELECT kicked, kicked_by, kick_reason, kick_time FROM '.KICK_TABLE.' ORDER BY kick_time DESC'); 
$muteq = $db->prepare('SELECT muted, muted_by, mute_reason, mute_time, mute_expires_on FROM '.MUTE_TABLE.' ORDER BY mute_time DESC'); 
$warnq = $db->prepare('SELECT warned, warned_by, warn_reason, warn_time FROM '.WARN_TABLE.' ORDER BY warn_time DESC'); 
$banq->execute(); 
$kickq->execute(); 
$muteq->execute(); 
$warnq->execute(); 

基本上我想所有這些查詢爲一體+兩個_Record表結合在一起。任何可以幫助我的建議都是非常值得讚賞的,因爲我花了無數個小時試圖自己解決這個問題。

提前致謝!

+0

選擇它們是從每個表興趣等於列,並做了UNION。 – Mihai

回答

3

試試這個:

SELECT * from (
SELECT banned as Punisher, banned_by as Punished, ban_reason as Reason, ban_expires_on as Expire, ban_time as Date FROM mb_bans 
UNION 
SELECT kicked as Punisher, kicked_by as Punished, kick_reason as Reason, NULL as Expire, kick_time as Date FROM mb_kicks 
UNION 
SELECT muted as Punisher, muted_by as Punished, mute_reason as Reason, mute_expires_on as Expire, mute_time as Date FROM mb_mutes 
UNION 
SELECT warned as Punisher, warned_by as Punished, warn_reason as Reason, NULL as Expire, warn_time as Date FROM mb_warnings 
) d order by d.Date DESC; 

編輯

我怎麼能得到記錄的類型?(IE。返回的結果是否是從禁止表,靜音表,踢表等)

SELECT * from (
    SELECT banned as Punisher, banned_by as Punished, ban_reason as Reason, ban_expires_on as Expire, 'ban' as TableType, ban_time as Date FROM mb_bans 
    UNION 
    SELECT kicked as Punisher, kicked_by as Punished, kick_reason as Reason, NULL as Expire, 'kick' as TableType, kick_time as Date FROM mb_kicks 
    UNION 
    SELECT muted as Punisher, muted_by as Punished, mute_reason as Reason, mute_expires_on as Expire, 'mute' as TableType, mute_time as Date FROM mb_mutes 
    UNION 
    SELECT warned as Punisher, warned_by as Punished, warn_reason as Reason, NULL as Expire, 'warn' as TableType, warn_time as Date FROM mb_warnings 
    ) d order by d.Date DESC; 
+0

非常感謝!這個最後的作品,我永遠不能得到UNION的聲明。我總是添加它們,而不被括在括號中。但是,有一個問題,我怎麼能得到這種記錄? (IE。返回結果是否來自禁止表,靜音表,踢表等) – Winter

+0

在編輯中添加類型記錄....並沒有問題:)我花了一些時間來了解... ... –

1

對這個問題的通用的答案是,

SELECT A.COL, B. COL, C.COL 
FROM TABLE1 AS 'A' 
INNER JOIN TABLE2 AS 'B' WHERE A.ID = B.ID 
INNER JOIN TABLE3 AS 'C' WHERE B.ID = C.ID 
. 
. 
. 
<YOU CAN PUT AS MUCH AS JOINS YOU WANT> 
ORDER BY <REQUIRED_COL> 

現在,在巨大的情況下做到這一點。

+1

對不起,這不是我想要的。卡洛斯的回答正是我想要完成的 - 我很少運氣讓這個工作。感謝您的嘗試,也許您的答案可能會幫助其他人! +1的努力。 – Winter