Mysql запрос справки с предложением где - PullRequest
0 голосов
/ 26 августа 2010

Таблица общественных работ

|student name (id in real table)|hours|year|event name (id in real table)|
|Johnny Smith                   |    5|2010|Beach Clean-up               |
|Samantha Bee                   |    3|2011|Daily Show Volunteering      |
|Samantha Bee                   |    2|2011|Daily Show Bake Sale         |
|Bilbo Baggins                  |   10|2011|The Shire Feast Setup        |

Из этой таблицы я хотел бы получить следующий вывод:

часов в 2011 году:

Johnny Smith:   0 (his hours are in 2010)
Samantha Bee:   5
Bilbo Baggins: 10

Вот моя неудачная попытка:

mysql_query("select name,
                    sum(hours) 
                    from community_service 
                    where year = '2011' 
                    or year is null 
                    group by name"); 

Я понимаю, почему «год ноль» не дает мне то, что я хочу, я просто не знаю, как это сделать правильно.

Заранее спасибо!

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

SELECT DISTINCT contacts.contactID, 
sum(hours) as hours, 
contacts.first, 
contacts.last, 
contacts.graduates 
from contacts 
left join comm_stud using (contactID) 
left join comm_svc using (csID) 
left join tbl_yeardiv on comm_svc.termID = tbl_yeardiv.yeardivID 
WHERE (year = '2010-11') 
group by contacts.contactID 

tbl_yeardiv содержит школьные термины, такие как осенний и весенний семестры. comm_stud присоединяет студентов к каждому событию comm_svc.

Ответы [ 4 ]

1 голос
/ 26 августа 2010

Разве вы не хотите group by name?

Если вы хотите, чтобы нулевые значения также появлялись, объедините таблицу против себя:

SELECT a.name, sum(b.hours)
from community_service a
LEFT OUTER JOIN
community_service b
on a.name = b.name
WHERE b.year = 2011
GROUP BY a.name

Если в реальных приложенияхЕсли у вас есть несколько таблиц, вы просто LEFT OUTER JOIN можете использовать таблицу пользователя ID-HOUR-YEAR.

0 голосов
/ 28 августа 2010

Решение на самом деле довольно простое. Это включает добавление условия к предложению ON. От: http://opensourceanalytics.com/2006/07/29/advanced-mysql-join-tips-tricks/

Теперь предположим, что вы хотите выполнять поиск не по всей таблице2, а по подмножеству таблицы2 (скажем, CityID = 1). Как ты это делаешь? Вы можете сами убедиться, что следующий SQL не является решением:

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL
and table2.CityID = 1

Обратите внимание, что это потому, что мы ищем записи, которые не существуют в таблице 2 и, следовательно, не могут иметь предложение where для данных таблицы 2.

Прочтите страницу руководства чуть дальше, и другой пользовательский комментарий указывает:

Conditions for the “right table” go in the ON clause.
Conditions for the “left table” go in the WHERE clause,
except for the joining conditions themselves.

Это делает решение следующим образом:

SELECT table1.* FROM table1 LEFT JOIN table2 ON (table1.id=table2.id and table2.CityID = 1)
WHERE table2.id IS NULL

Итак, решение моего исходного запроса выглядит примерно так: (проверенный рабочий запрос)

SELECT DISTINCT contacts.contactID, 
sum(hours) as hours, 
contacts.first, 
contacts.last, 
contacts.graduates from contacts
left join comm_stud using (contactID)
left join comm_svc using (csID)

(Это секретный соус:)

left join tbl_yeardiv on (comm_svc.termID = tbl_yeardiv.yeardivID && year = '".thisyear()."')

left join group_members on contacts.contactID = group_members.contactID
left join groups using (groupID)
WHERE groups.name = 'Students' 
and group_members.status like '%Matriculated%'
group by contacts.contactID 

Спасибо всем за помощь, всем. Я надеюсь, что то, что я нашел, поможет вам легче писать запросы.

0 голосов
/ 26 августа 2010

Вам не нужно sum(hours), hours будет хорошо.

select name,
       hours 
from community_service 
where year = '2011'
0 голосов
/ 26 августа 2010

попробуй isnull(years). Кроме того, вам не нужно sum, если у вас не более одной записи на одного учащегося в год (если вы это делаете, вы можете использовать sum разумно, если вы также group by name, year). Наконец, почему год - это строка, то есть, почему вы помещаете вокруг нее апострофы?

Если ничего из этого не помогло, обновите ваш пост, указав, что именно не работает.

...