0

我正在尝试从两个表和 ORDER BY 日期(他们都有的列)中选择。一个表(tableA)有一个名为“A”的列,另一个表(tableB)有一个名为“B”的列,我使用array_key_exists()来区分两者(如果“A”键存在,我运行数组通过FunctionA(),如果“B”键存在,我通过 FunctionB()) 运行数组。我只需要 20 个最新的(日期方面的)条目。我需要 SQL 查询来完成此操作。

我已经知道回复将是“如果它们的结构相似,那么你应该只使用一个表”,但我不想这样做,因为 tableA 与 tableB 截然不同(tableA 中有更多列),并且使用单个表来存储数据会导致为 tableB 格式化的条目有很多空列,更不用说由于 tableB 不需要 tableA 的大多数列,这将是一个非常难看的表格式)。

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

顺便说一下,我需要选择 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++;
}
4

1 回答 1

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 * 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'

这就是你想要的,不是吗?理解你真正想要达到的目标有点困难......

于 2011-08-17T18:00:41.727 回答