从两个表中选择WHERE每个表中的不同列等于$ id ORDER BY公共列(PHP / MySQL)

时间:2011-08-17 17:52:25

标签: php mysql multiple-tables

我正在尝试从两个表和ORDER BY日期(它们都有一个列)中进行SELECT。一个表(tableA)有一个名为“A”的列,另一个表(tableB)有一个名为“B”的列,我使用array_key_exists()来区分这两个(如果“A”键存在,我运行数组通过FunctionA(),如果存在“B”键,我通过FunctionB()运行数组。我只需要20个最新(日期明智)条目。我需要SQL Query来实现这一目标。

我已经知道答案将是“如果他们的结构类似,那么你应该只使用一个表”,但我不想这样做,因为tableA与tableB完全不同(更多的列在tableA),并使用单个表来存储数据将导致为tableB格式化的条目产生大量空列,更不用说由于tableB不需要tableA的大多数列,因此它看起来非常难看。

我只想以有序(按日期)的方式在一个表中显示来自两个表的数据。

顺便说一句,我需要SELECT WHERE tableA.poster_id = $ id和tableB.receiver_id = $ id。

解决方案:

我正在更新这个以防万一其他有同样困境的人出现。在实现@Erik A. Brandstadmoen慷慨地给我的SQL查询之后,这基本上就是我的代码最终结果:

$MySQL->SQL("SELECT * FROM
              (SELECT A.id AS id, A.date AS date, 'tableA' AS source 
                 FROM tableA A WHERE A.poster_id = $id 
                    UNION
                      SELECT B.id AS id, B.date AS date, 'tableB' AS source
                           FROM tableB B WHERE B.receiver_id = $id) AS T
                               ORDER BY T.date DESC LIMIT 0, 20");

$GetStream = array();
$i = 0;
while ($row = mysql_fetch_array($MySQL->Result))
{
    $GetStream[$i]['id'] = $row['id'];
    $GetStream[$i]['date']=$row['date'];
    $GetStream[$i]['source'] = $row['source'];
    $i++;
}

*** later on down the code ***

$i = 0;
while ($i<count($GetStream))
{
    if ($GetStream[$i]['source'] == "tableA")
    { 
        FunctionA($GetStream[$i]);
    }
    else
    {
        FunctionB($GetStream[$i]);
    }
    $i++;
}

1 个答案:

答案 0 :(得分:2)

尝试使用UNION

SELECT * FROM (
SELECT A.col1 AS x, A.col2 As y, A.col3 AS date FROM tableA A
WHERE tableA.poster_id = $id
UNION 
SELECT B.colA AS x, B.colB AS y, B.colC AS date FROM  tableB B
WHERE tableB.receiver_id = $id
)
ORDER BY date DESC
LIMIT 0, 20

或者,如果您想在tableA和tableB之间保留重复项,请改用UNION ALL

编辑,根据您的评论,我知道您需要一个列来指示该行来自哪个表。您可以在select中添加静态列,如下所示:

SELECT * FROM (
SELECT A.col1 AS x, A.col2 As y, A.col3 AS date, 'A' as source FROM tableA A
WHERE tableA.poster_id = $id
UNION 
SELECT B.colA AS x, B.colB AS y, B.colC AS date, 'B' as source FROM  tableB B
WHERE tableB.receiver_id = $id
)
ORDER BY date DESC
LIMIT 0, 20

这为您提供了以下表格的漂亮表格:

x    y    date    source
=========================
(v1) (v2) (d1)    'A'
(v3) (v4) (d2)    'B'
(v1) (v2) (d3)    'B'
(v3) (v4) (d4)    'A'

这样做你想要的,不是吗?理解你真正想要实现的目标有点困难......

相关问题