我在这里有两张表table_user
和table_feedback
,如下所示
table_user
| id | name |
|----|------|
| 1 | john |
| 2 | tony |
| 3 | mona |
table_feedback
| id | rate | user_id | date |
|----|------|---------|----------|
| 1 | 1 | 3 |2015-11-2 |
| 2 | 1 | 2 |2015-11-2 |
| 3 | 1 | 3 |2015-11-1 |
我希望date
来自table_feedback
的{{1}}以及来自name
的{{1}}来显示报告,如果table_feedback将显示所有id
没有包含用户ID然后这将返回空白数据。我对table_user
有所了解,这是我的疑问。问题是查询只返回2行,但我需要3行,包括table_user id 1和空白列率。
这是我在下面的查询。
user
答案 0 :(得分:2)
对此的解决方案是外部联接。每当你发现自己在想“我需要查看此表中的所有行时,无论其他表中是否存在匹配......”时,您都应该查看外部联接。
我们可以使用外部联接来选择所有用户,并将它们链接到我们的JOIN
子句中的feedbackTable。这将为表中不匹配的任何列返回空值。试试这个:
SELECT u.id, u.name, t.rate, t.dateCol
FROM userTable u
LEFT JOIN feedbackTable t ON t.user_id = u.id AND t.dateCol = '2015-11-02';
这是一个SQL Fiddle示例。作为旁注,最好不要命名日期列date
,因为这是MySQL中的关键字。
根据您的预期结果进行修改:
要确保每行显示日期列,您可以将其硬编码到您的选择中。如果您选择使用变量,则不必每次更新日期两次,您只需更新声明:
SET @reportDate = '2015-11-02';
SELECT u.id, u.name, t.rate, @reportDate
FROM userTable u
LEFT JOIN feedbackTable t ON t.user_id = u.id AND t.dateCol = @reportDate;
以下是更新的SQL Fiddle。
答案 1 :(得分:1)
我的猜测是你需要使用LEFT JOIN
:
SELECT
table_user.id,
table_user.name,
table_feedback.rate,
table_feedback.date
FROM table_user
LEFT JOIN table_feedback
ON table_user.id = table_feedback.user_id
AND table_feedback.date = '2015-11-2'
答案 2 :(得分:0)
要包含没有反馈的用户,您需要使用LEFT OUTER JOIN
SELECT
table_user.id,
table_user.name,
table_feedback.rate,
'2015-11-2'
FROM table_feedback
LEFT OUTER JOIN table_user
ON table_user.id = table_feedback.user_id
WHERE table_feedback = '2015-11-2'
答案 3 :(得分:0)
您需要对查询进行三次修改:
所以:
SELECT
table_user.id,
table_user.name,
table_feedback.rate,
table_feedback.date
FROM table_user
LEFT JOIN table_feedback ON table_user.id = table_feedback.user_id and table_feedback.date = '2015-11-02'