2014-11-11 3 views
1

У меня есть две таблицы.SQL «прикованные» запросы?

Я новичок в SQL. Использование mysql на данный момент. У меня есть следующая настройка для связанного со школой db:

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

В таблице B содержатся записи о посещаемости занятий. Каждая запись звучит так: дата, студент id, класс

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

Теперь, глупый способ будет

  1. первый я SELECT all classes from Table B with DATE IN BETWEEN the range

  2. то для каждого класса, я получаю удостоверение личности студента и SELECT * FROM students WHERE id = student id

То, что я не могу оберните мой разум вокруг умным способом. Как это сделать только в одном запросе. я терплю неудачу в понимании концепции JOIN, UNION и так далее ...

моя догадка до сих пор

SELECT students.id, students.name, students.lastname 
FROM students, classes 
WHERE classes.date BETWEEN 20140101 AND 20150101 
AND 
classes.studentid = students.id 

, но это подходящий способ для этого случая?

+0

У вас есть решение? adam_b –

+0

См. это [ссылка] (http://stackoverflow.com/questions/38549/difference-between-inner-and-outer-joins/38578#38578). Кроме того, 'WHERE classes.date BETWEEN AND ' (no 'IN') – programmer43229

+0

Кроме описанной выше синтаксической ошибки. В чем проблема с запросом? путем объединения двух таблиц, которые вы просто запрашиваете один раз. – TheProvost

ответ

0

Не добавляйте утверждение объединения в предложение where. Сделайте это вот так:

SELECT s.id, s.name, s.lastname,c.date,c.grade 
FROM classes c 
inner join students s 
on c.studentid=s.id 
WHERE c.date BETWEEN '01/01/2014' AND '01/01/2015' 
+0

спасибо, я думаю, что это то, что я искал, так как он улучшает мой запрос, хотя и неявно объясняя, как работает JOIN –

0

Это звучит как задание, поэтому я попытаюсь описать проблему и дать подсказку.

Примером союза может быть;

SELECT students.name, students.lastname 
FROM students 
WHERE students.lastname IS NOT NULL 

UNION 

SELECT students.name, 'N/A' 
FROM students 
WHERE students.lastname IS NULL; 

+--------------+--------------+ 
| name   | lastname  | 
+--------------+--------------+ 
| John   | Doe   | <- First two rows came from first query 
| Jill   | Smith  | 
| Bill   | N/A   | <- This came from the second query 
+--------------+--------------+ 

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

Примером объединения будет;

SELECT authors.id, authors.name, books.title 
FROM authors LEFT JOIN books ON authors.id = books.authors_id 

+--------------+--------------+------------------+ 
| id   | name   | title   | 
+--------------+--------------+------------------+ 
| 1   | Mark Twain | Huckleberry Fin. | 
| 2   | Terry Prat.. | Good Omens  | 
+--------------+--------------+------------------+ 
    ^First two columns from ^Third column appended 
     from authors table   from books table linked 
            by "author id" 

Подумайте о соединении в качестве добавляемых столбцов к вашим результатам, объединение добавляет строки с одинаковыми столбцами.

В вашей ситуации мы можем исключить объединение, так как вы не хотите добавлять дополнительные строки ученика, вы хотите, чтобы информация о классе и ученике была рядом.

+0

Присоединиться, а не присоединиться к объединению :) –

+1

Хотелось бы ему назначить задание. Мне 73 года :) Спасибо за подсказку –

+0

@adam_b; ОК :) Я думаю, что TheProvost дал окончательный ответ, надеюсь, что мое объяснение помогло. – harvey

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