我正在尝试显示在创建数据时排序的两个不同表格中的数据。
以下是我从中提取数据的两个表:
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次的任何想法?
答案 0 :(得分:2)
您的查询在运行时性能方面非常糟糕,并且不会产生您希望的结果。 可能更有用:
$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与表喜欢一起加入。
答案 1 :(得分:0)
首先您的查询有问题。你做不到
select * from (select ...)
。
在调用另一个子查询之前应该有'where'子句。
您应该使用join而不是union,因为union用于显示具有相同列名/类型(别名)的表的结果,而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;
实际上,您可以选择RIGHT JOIN和LEFT JOIN。