对于这个MYSQL查询,我应该使用JOIN还是UNION ?


Should I use JOIN or UNION for this MYSQL query?

我试图显示两个不同表的数据,按数据创建时间排序。

下面是我从中提取数据的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;

实际上,您可以在右连接和左连接之间进行选择。