mysql выбирает внутри select

#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 .