Php MySQL联合所有左连接

Php MySQL联合所有左连接,php,mysql,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.c

我正试图找出最有效的查询,将两个表中的数据放入一组结果中,并将用户数据左键连接到其中。我需要有关查询语法的帮助。我已经把下面的内容放在一起了,但不太正确

$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服务器版本对应的手册,了解第4行“users.contact\u person,users.email ON users.user\u id=comments.user\u id WHERE us”附近使用的正确语法

我现在已经到了下面的这一点,但在“字段列表”中获得未知列“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
这是你的问题:

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
    *
FROM
    (SELECT * FROM activity UNION SELECT * FROM comments) user_actions
    LEFT JOIN users ON (users.user_id = user_actions.user_id)
请注意,在本次更新的两个示例中,我都提供了pseudocode1—您需要填写这些空白。你会发现,在计算机科学中,举一个概括的例子(比如从手册中)并将其应用到你自己的用例中的技巧是经常发生的事情,因此你应该尽可能经常地练习

1也就是说,包含子查询的第二个版本已经完成,除了更改要获取的列之外——因此您可能已经完成了95%的操作

这是您的问题:

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
    *
FROM
    (SELECT * FROM activity UNION SELECT * FROM comments) user_actions
    LEFT JOIN users ON (users.user_id = user_actions.user_id)
请注意,在本次更新的两个示例中,我都提供了pseudocode1—您需要填写这些空白。你会发现,在计算机科学中,举一个概括的例子(比如从手册中)并将其应用到你自己的用例中的技巧是经常发生的事情,因此你应该尽可能经常地练习


1也就是说,包含子查询的第二个版本已经完成,除了更改要获取的列之外——因此您可能已经完成了95%的操作

最后,我带着下面的内容来到这里,欣赏一下哈弗的方向

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

因此,最终与下面的,欣赏方向半身人

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

你说的“不完全正确”是什么意思?它有用吗?语法有什么问题?还有,为什么你要加入用户的评论?如果存在注释,它不应该总是有用户吗?或者可以使用空的
注释进行注释。用户id
?#1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解第4行“users.contact\u person,users.email ON users.user\u id=comments.user\u id WHERE us”附近使用的正确语法“不完全正确”是什么意思?它有用吗?语法有什么问题?还有,为什么你要加入用户的评论?如果存在注释,它不应该总是有用户吗?或者可以使用空的
注释进行注释。用户id
?#1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解在第4行“users.contact\u person,users.email ON users.user\u id=comments.user\u id WHERE us”附近使用的语法是否正确。这只是为了说明,如果可能的话,我只希望用户表中的这三列。我最初的查询是从activity UNION中选择comment\u id、user\u id、comment、timestamp所有选择comment\u id、user\u id、comment、timestamp从comments中选择LEFT JOIN users ON users.user\u id=comments.user\u id按timestamp Descellent排序字段列表中抛出的列“user\u id”是含糊不清的!这意味着你在这条路上走的最远。只要澄清你在这里指的是哪张表,你就完成了!(既然他们加入了,你选择哪一个并不重要——我已经将我的答案修改为
users
。感谢你的帮助。我感到沮丧和不耐烦,所以为被骗的帖子道歉只是为了说明我只想要用户表中的这三列,如果可能的话。我最初的查询是从activity UNION中选择comment\u id、user\u id、comment、timestamp所有选择comment\u id、user\u id、comment、timestamp从comments中选择LEFT JOIN users ON users.user\u id=comments.user\u id按timestamp Descellent排序字段列表中抛出的列“user\u id”是含糊不清的!这意味着你在这条路上走的最远。只要澄清你在这里指的是哪张表,你就完成了!(既然他们加入了,你选择哪一个并不重要——我已经将我的答案修改为
users
。感谢你的帮助。正在变得沮丧和不耐烦,所以为被骗道歉,太好了!我添加了一些建议的格式,这将使它更清晰,它是一个
UNION
语句。太棒了!我已经添加了一些建议的格式,这将使它更清楚地表示它是一个
UNION
语句。