我应该在这个MYSQL查询中使用JOIN或UNION吗?

时间:2013-05-24 09:02:40

标签: php mysql join union

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

以下是我从中提取数据的两个表:

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次的任何想法?

2 个答案:

答案 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。