带有LEFT JOIN的MySQL UNION ALL

时间:2014-03-28 23:54:51

标签: php mysql

我正在尝试找出最有效的查询,将两个表中的数据放入一组结果中,然后将用户数据加入其中。我需要有关查询语法的帮助。我把下面的内容放在一起,但不太对。

$query_chat = sprintf("SELECT comment_id, user_id, comment, timestamp FROM activity 
UNION ALL
SELECT comment_id, user_id, comment, timestamp FROM comments
LEFT JOIN users.company, users.contact_person, users.email ON users.user_id = comments.user_id
WHERE user_id = %s
ORDER BY timestamp DESC", GetSQLValueString($_GET['comment_id'], "INT"));

语法错误并引发了下面的内容 - 我试图通过仅从users表中选择我需要的内容来提高效率。

  

1064 - 您的SQL语法出错;检查与您的MySQL服务器版本相对应的手册,以获得正确的语法,以便在'附近使用。 users.contact_person,users.email ON users.user_id = comments.user_id在我们这里'在第4行

我现在已经到了以下这一点,但获得了未知专栏' users.company'在'字段列表'

SELECT
    comments.comment_id, comments.user_id, comments.comment,
    comments.timestamp,
    users.company, users.contact_person, users.email
FROM
    comments
UNION ALL
SELECT
    activity.comment_id, activity.user_id, activity.comment,
    activity.timestamp, 
    users.company, users.contact_person, users.email
FROM
    activity
LEFT JOIN users ON users.user_id = comments.user_id
WHERE
comments.comment_id = 69 ORDER BY timestamp ASC

2 个答案:

答案 0 :(得分:3)

这是你的问题:

LEFT JOIN
    users.company, users.contact_person, users.email
    ON users.user_id = comments.user_id

语法为:

LEFT JOIN (table) ON (join-clause)

所以,在你的情况下,我认为你需要这样的东西:

SELECT
    comments.comment_id, comments.user_id, comments.comment,
    comments.timestamp,
    users.company, users.contact_person, users.email
FROM
    comments
    LEFT JOIN users ON users.user_id = comments.user_id
WHERE
    users.user_id = %s
;

正如您所看到的,当使用JOIN时,列首先(来自所有表)然后是下一个表,以及相应的JOIN子句。


更新:在回复您的更新时,您有两个选择。你可以这样做(你最接近):

SELECT
    (users joined to activity)
UNION
    (users joined to comments)

你已经知道如何做上面的(表达式) - 请参阅我的答案的前面部分。或者,你可以这样做:

SELECT
    *
FROM
    (SELECT * FROM activity UNION SELECT * FROM comments) user_actions
    LEFT JOIN users ON (users.user_id = user_actions.user_id)

请注意,在本次更新的两个示例中,我提供伪代码 1 - 您需要填写空白。您会发现采用一般化示例(例如手册)并应用于您自己的用例的技巧在计算机科学中发生了很多事情,因此您应该尽可能经常地练习。

1 也就是说,除了将列更改为fetch之外,包含子查询的第二个版本已经完成 - 所以你可能只有95%了!

答案 1 :(得分:2)

所以终于到了下面,欣赏方向halfer

SELECT
    comments.*, users.company, users.contact_person, users.email
    FROM
        comments
    LEFT JOIN users ON users.user_id = comments.user_id
    WHERE
        comment_id = %s
UNION ALL
SELECT activity.*, users.company, users.contact_person, users.email
    FROM
        activity
    LEFT JOIN users ON users.user_id = activity.user_id
    WHERE
        comment_id = %s
ORDER BY
    timestamp ASC