mysql帮助制作报告

时间:2015-11-02 18:06:14

标签: mysql sql

我在这里有两张表table_usertable_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

4 个答案:

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

您需要对查询进行三次修改:

  1. 使用LEFT JOIN代替INNER JOIN(以获取所有用户)
  2. 更改表格顺序(首先是要获取所有行的表格 从)
  3. 由于用户1(john)在第二个表中没有任何数据,您 不能限制WHERE子句中的行。在JOIN中做限制 相反,它只适用于与JOIN匹配的行。
  4. 所以:

    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'