Как я могу сделать несколько операторов выбора на одной и той же таблице? - PullRequest
0 голосов
/ 08 декабря 2010

У меня есть таблица, в которой хранится информация о работе ученика. Мне нужно выбрать часы на основе идентификатора студента и квартала. Вот что у меня есть:

SELECT
(SELECT hours FROM clinicalStudents WHERE quarterID='201101' and studentID='$studentID') as q1,             
(SELECT hours FROM clinicalStudents WHERE quarterID='201102' and studentID='$studentID') as q2,             
(SELECT hours FROM clinicalStudents WHERE quarterID='201103' and studentID='$studentID') as q3,             
(SELECT hours FROM clinicalStudents WHERE quarterID='201104' and studentID='$studentID') as q4

Это только дает мне некоторые цифры, но не все из них. Я запустил это (без предложения WHERE) в диспетчере сервера и получил ошибку:

"Подзапрос возвратил более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется как выражение"

Любая помощь будет великолепна. Спасибо!

EDIT:

$ studentID генерируется в цикле while, поэтому я использую часы для этого студента, прежде чем перейти к следующему. Я получаю все часы для одного студента в каждом квартале, добавляя их (это должно быть сделано за пределами SQL), сохраняя результаты в переменной, а затем переходя к следующему студенту. Это прекрасно работает, когда я получаю 1 квартал, но у меня проблема с получением всех четвертей.

РЕДАКТИРОВАТЬ Раунд 2: Я сделал это довольно лениво, я полагаю:

Я просто выбрал все часы и квартальные идентификаторы для конкретного студента. Затем побежал некоторое время (odbc_fetch_row ()). Если это был 201101, я добавил его в стопку $ q1, 201102 добавил в стопку $ q2 и так далее. Обработка немного медленнее, но не является большой проблемой с тем, что я делаю.

Ответы [ 5 ]

1 голос
/ 08 декабря 2010

Я не уверен, какова ваша цель ...

Может быть, вы действительно хотите:

select quarterID, sum(hours) 
from clinicalStudents 
where studentID='$studentID' 
group by 1
1 голос
/ 08 декабря 2010

пытается использовать SELECT TOP 1 или LIMIT 1 в запросе, в зависимости от того, какой sql вы используете.

EDIT Кроме того, почему вы пытаетесь выполнить?Это кажется неуклюжим, и, в зависимости от вашей цели, возможно, есть лучший способ.

0 голосов
/ 09 декабря 2010

Попробуйте это.

select studentID
      ,sum(case when quarterID = '201101' then hours end) as q1
      ,sum(case when quarterID = '201102' then hours end) as q2
      ,sum(case when quarterID = '201103' then hours end) as q3
      ,sum(case when quarterID = '201104' then hours end) as q4
  from clinicalStudents
 where quarterID in('201101', '201102', '201103', '201104')
 group by studentID;
0 голосов
/ 08 декабря 2010

РЕДАКТИРОВАТЬ в цикле.

Не использовать цикл для выполнения операции SUM. Вместо этого используйте операцию агрегирования SUM

Позволяет проецировать каждый квартал на каждый столбец.

   SELECT
 cs.studentid , q1.hours Q1, q2.hours Q2, q3.hours Q3, q4.hours Q4
    FROM 
    clinicalStudents cs
    (SELECT SUM(hours) hours , studentID 
     FROM clinicalStudents 
     WHERE quarterID='201101' and studentID='$studentID' 
     GROUP BY studentID ) q1
    LEFT join on cs.studentID = q1.clinicalStudents 
    (SELECT SUM(hours) hours , studentID  
     FROM clinicalStudents WHERE quarterID='201102' and studentID='$studentID' 
    GROUP BY studentID )  q2
    LEFT join on cs.studentID = q2.clinicalStudents              
    (SELECT SUM(hours) hours  , studentID 
     FROM clinicalStudents 
     WHERE quarterID='201103' and studentID='$studentID'
     GROUP BY studentID ) q3             
    LEFT join on cs.studentID = q3.clinicalStudents              
    (SELECT SUM(hours) hours , studentID 
     FROM clinicalStudents 
     WHERE quarterID='201104' and studentID='$studentID' GROUP BY studentID ) q4
    LEFT join on cs.studentID = q4.clinicalStudents          
    WHERE cs.studentID='$studentID'
0 голосов
/ 08 декабря 2010
SELECT 
hours, SUBSTR(quarterId, 4, 2)
FROM 
clinicalStudents 
WHERE 
quarterID IN ('201101', '201102', '201103', '201104') and studentID='$studentID'

В зависимости от того, какую базу данных вы используете, вам придется изменить функцию SUBSTR

...