2012-11-06 5 views
0

У меня есть следующие две таблицы:Запрос дает нежелательные результаты

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 

Результат моего запроса должен выглядеть следующим образом:

, и я пытаюсь выполнить следующий запрос в порядке в список лаборанта и количество часов, они работали каждый семестр

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; 

результаты моего Quere должны выглядеть так:

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 

Так в основном, это просто не считая собственных часов для Деннис Родман. Это должно быть 8, а не 4.

И я, вероятно, не должен использовать DISTINCT здесь, потому что возможно, что один и тот же человек может работать в разных семестрах.

ответ

2

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 with Demo

Результаты:

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

@JimRomeFan см. Мое редактирование на основе вашего образца данных – Taryn

+0

Большое спасибо. – JimRomeFan

1

Это потому, что DISTINCT является модификатором до SELECT и не может быть использован так. В вашем случае лучше всего применить GROUP BY на hw.hw_semester, чтобы исправить это.

0

MySQL syntax for SELECT показывает, что DISTINCT потребности прийти перед именами столбцов:

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

Каждый select_expr указывает на столбец, который вы хотите получить ,

В принципе, DISTINCT может применяться только ко всему запросу, а не к одному столбцу.

Смежные вопросы