#php #mysql
#php #mysql
Вопрос:
это первый раз, когда я занимаюсь базами данных, и мне было интересно, возможно ли сделать следующее: у меня есть две таблицы
student (id, name, phone)
photos (id, student_id, photo)
Я хотел получить телефон студента, имя которого, скажем, «Том», но только если у него есть фотография.
Возможно ли вообще иметь подобное условие?
Большое спасибо
Комментарии:
1. Вам нужно прочитать о соединениях.
Ответ №1:
select s.phone from student s
inner join photos p
on p.student_id=s.id
where p.photo is not null
Комментарии:
1. @bryanmac: Предполагая, что
photos.photo
это обнуляемое значение.2. @ypercube: Разве это не может быть выведено из вопроса?
only if it has a photo...
3. @Icarus: Это
from student
, неstudents
. Вам также понадобитсяwhere name = 'Tom'
.4. Вывод? Нет. Я бы предположил, что у пользователя есть фотография, если в таблице есть строка
photos
с егоid
фотографией. Но добавлениеwhere p.photo is not null
не повредит ни в том, ни в другом случае.
Ответ №2:
Это называется INNER JOIN
.
select top 1 name from student s
inner join photos p
on s.id = p.student_id
where name like 'Tom'
Ответ №3:
В этом случае вы можете использовать объединение. Попробуйте это:
SELECT student.phone
FROM students
INNER JOIN photos
ON student.id=photos.student_id
WHERE student.name LIKE 'Tom'
Ответ №4:
ДА. Используя EXISTS
:
SELECT phone
FROM student
WHERE name = 'Tom'
AND EXISTS
( SELECT *
FROM photos
WHERE photos.student_id = student.id
)
или используя JOIN
. Вам нужно использовать либо DISTINCT
, либо GROUP BY
, чтобы вы не получали один и тот же телефон 20 раз, если у пользователя 20 фотографий:
SELECT DISTINCT student.phone
FROM student
JOIN photos
ON photos.student_id = student.id
WHERE student.name = 'Tom'
Комментарии:
1. Должно быть внутреннее объединение imo, которое устраняет необходимость в DISTINCT, позволяет приложению выбирать, какую фотографию отображать. Также я думаю, вы имели в виду «ту же фотографию 20».
2. Нет, я имел в виду тот же телефон. У нас есть
SELECT phone
, неSELECT photo
.3. Также:
INNER JOIN
это то же самое, чтоJOIN
. Ни то, ни другое не обходится безDISTINCT
, если мы хотим отображать только телефон, а не телефон фотографии.4. Аааа, я виноват. По какой-то причине я думал, что
JOIN
этоLEFT JOIN
.