繁体   English   中英

查询给出不良结果

[英]Query giving undesirable results

我有以下两个表:

lab_assistant
la_id - la_firstname - la_lastname
1 - Dennis - Rodman
2 - Michael - Jordan
3 - Horace - Grant

hours_worked
hw_semester - hw_date - hw_hours - la_id
Fall 2012 - 2012-11-01 - 4 - 2
Fall 2012 - 2012-11-04 - 5 - 3
Spring 2012 - 2012-02-12 - 4 - 1
Spring 2012 -2012-03-10 - 4 - 1

我的查询结果应如下所示:

我正在尝试运行以下查询,以列出Lab Assistant及其每个学期的工作时间

SELECT DISTINCT(CONCAT(la.la_firstname, ' ', la.la_lastname)) AS 'Lab Assistant',
   hw.hw_semester AS 'Semester Worked', hw.hw_hours AS 'Hours Worked'
FROM lab_assistant la
    JOIN hours_worked hw
        ON la.la_id = hw.la_id;

我的查询结果应如下所示:

Michael Jordan - Fall 2012 - 4
Horace Grant - Spring 2012 - 5
Dennis Rodman - Fall 2012 - 8

但是我得到的结果如下:

Michael Jordan - Fall 2012 - 4
Horace Grant - Fall 2012 - 5
Dennis Rodman - Spring 2012 - 4

所以从根本上讲,这只是在计算Dennis Rodman的正常工作时间。 应该是8,而不是4。

我可能不应该在这里使用DISTINCT,因为同一个人可能在不同的学期工作。

DISTINCT需要在SELECT的开头进行:

SELECT DISTINCT CONCAT(la.la_firstname, ' ', la.la_lastname) AS 'Lab Assistant',
    hw.hw_semester, COUNT(w.hw_hours)
FROM lab_assistant la
    JOIN hours_worked hw
        ON la.la_id = hw.la_id;

但是,由于您正在使用聚合函数,因此您将需要使用GROUP BY

SELECT CONCAT(la.la_firstname, ' ', la.la_lastname) AS 'Lab Assistant',
    hw.hw_semester, COUNT(w.hw_hours)
FROM lab_assistant la
    JOIN hours_worked hw
        ON la.la_id = hw.la_id
GROUP BY hw.hw_semester;

根据您的编辑,您需要以下内容:

SELECT CONCAT(la.la_firstname, ' ', la.la_lastname) AS 'Lab Assistant',
  hw.hw_semester AS 'Semester Worked', 
  sum(hw.hw_hours) AS 'Hours Worked'
FROM lab_assistant la
JOIN hours_worked hw
  ON la.la_id = hw.la_id
GROUP BY la.la_id, hw.hw_semester;

参见带有演示的SQL Fiddle

结果:

|  LAB ASSISTANT | SEMESTER WORKED | HOURS WORKED |
---------------------------------------------------
|  Dennis Rodman |     Spring 2012 |            8 |
| Michael Jordan |       Fall 2012 |            4 |
|   Horace Grant |       Fall 2012 |            5 |

这是因为DISTINCTSELECT的修饰符,不能那样使用。 在您的情况下,最好的方法是在hw.hw_semester上应用GROUP BY进行修复。

SELECTMySQL语法显示DISTINCT必须在列名之前:

SELECT
[ALL | DISTINCT | DISTINCTROW ]
  [ .. etc .. ]
select_expr [, select_expr ...]

每个select_expr都指示您要检索的列。

基本上, DISTINCT只能应用于整个查询,而不能应用于单个列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM