我试图显示两个不同表的数据,按数据创建时间排序。
下面是我从中提取数据的2个表:
active_projects
+------------+------------+---------+-------+-------------+
| project_id | ts_created | user_id | title | description |
+------------+------------+---------+-------+-------------+
喜欢+---------+------------+------------+
| user_id | project_id | ts_created |
+---------+------------+------------+
期望的结果是从这些列中检索到的所有数据正确显示,并按以下列排序:
+------------+
| ts_created |
+------------+
这是我当前正在使用的查询:
$sql = "SELECT *
FROM (SELECT project_id AS ppid,
ts_created AS pts,
user_id AS puid,
title AS ptitle,
description AS pdesc
FROM active_projects
WHERE user_id = 12)
UNION
(SELECT id AS lid,
user_id AS luid,
project_id AS lpid,
ts_created AS lts
FROM likes
WHERE user_id = 12)";
但是,它没有按我想要的方式工作。我一直在试着调试发生了什么,但现在它只是说它实际上没有检索任何数据。
我一直在研究JOIN和UNION,但不确定我应该为这个查询使用哪个。如有任何帮助,不胜感激。
编辑:现在使用@Samuel的答案可以正确显示查询。但是,现在结果每行显示3次。我在查询的末尾这样做:
$act = mysql_query($sql);
然后,当我回显结果时,我使用像这样的while循环:
while ($t = mysql_fetch_row($act)) {
echo $t[1];
}
关于为什么每行被显示3次的任何想法?
您的查询在运行时性能方面相当糟糕,它不会产生您希望的结果。可能更有用:
$sql = "
SELECT * FROM active_projects
LEFT JOIN likes ON (active_projects.user_id = likes.user_id)
WHERE user_id = 12";
未经测试,但这是你所需要的。这将创建active_project中user_id 12左与表like连接的所有条目的结果。
首先你的查询有问题。你不能这么做select * from (select ...)
。在调用另一个子查询之前应该有'where'子句。
您应该使用join而不是union,因为union用于显示具有相同列名/类型(别名)的表的结果,而join使用来自另一个表的外键来显示'join '输出。
执行以下操作:
SELECT A.project_id AS ppid,
A.ts_created AS pts,
A.user_id AS puid,
A.title AS ptitle,
A.description AS pdesc,
B.id AS lid,
B.user_id AS luid,
B.project_id AS lpid,
B.ts_created AS lts
FROM active_projects A
LEFT JOIN likes B ON
A.user_id = B.user_id
WHERE A.user_id = 12 ORDER BY B.ts_created;
实际上,您可以在右连接和左连接之间进行选择。