2013-12-12 121 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