我正在尝试从两个表和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++;
}
答案 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'
这样做你想要的,不是吗?理解你真正想要实现的目标有点困难......