0

我正在尝试显示按数据创建时间排序的两个不同表中的数据。

这是我从中提取数据的 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 次的任何想法?

4

2 回答 2

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 与表 likes 连接。

于 2013-05-24T09:19:15.293 回答
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 之间进行选择。

于 2013-05-24T09:19:45.590 回答