#php #mysql #sql
#php #mysql #sql
Вопрос:
У меня есть три таблицы:
users
-----------------------------------
id | firstname | lastname | username
-----------------------------------
1 | John | Doe | jdoe
-----------------------------------
2 | Maria | T. | marty
-----------------------------------
3 | Alex | White | alexw
-----------------------------------
questions
--------------------------------------------
id | user_id | title
--------------------------------------------
1 | 2 | My first question?
--------------------------------------------
2 | 3 | One more question?
--------------------------------------------
3 | 3 | The third question?
--------------------------------------------
answers
----------------------------------------------
id | question_id | description
----------------------------------------------
1 | 2 | Answers to the 2nd question
----------------------------------------------
2 | 1 | Answer for 1st question
----------------------------------------------
3 | 1 | Another answer for 1st
----------------------------------------------
Теперь я хочу получить весь вопрос с именем пользователя (спрашивающего), фамилией, именем пользователя и количеством общих ответов, заданных на вопрос.
Пожалуйста, помогите его написать. Поскольку я перепутал свой запрос, он не был размещен здесь.
Спасибо
Комментарии:
1. Почему вы использовали идентификатор для пользователей, когда вы можете использовать имя пользователя в качестве первичного ключа?
2. Разве вы не имеете в виду количество общих ответов, заданных на вопрос ?
3. @AurelioDeRosa: просто потому, что есть
id
поле записи, это не делает его первичным ключом, однако обычно всегда полезно иметь это. Представьте, что если вы структурируете свою таблицу так, чтобы в ней были активные даты, у вас может быть то жеusername
самое (первичным ключом может быть имя пользователя поле даты ), но записьid
все равно будет уникальной.4. ‘fistname’, конечно, должно быть ‘firstname’ в первой таблице. Функция редактирования не допускает менее шести тривиальных исправлений, поэтому, возможно, OP или модератор могут внести исправления?
5. 1 за наличие отдельного первичного ключа. @AurelioDeRosa, в этом случае OP может добавить уникальное ограничение на ‘username’, но наличие отдельного целого числа PK — это нормально.
Ответ №1:
SELECT q.*, u.*, COUNT(a.id) as answer_count
FROM questions q
LEFT JOIN users u ON q.user_id = u.id
LEFT JOIN answers a ON a.question_id = q.id
GROUP BY q.id
Комментарии:
1. Почти уверен, что тебе там нужна группа
2. если у вас есть
q.*,u.*
, вам нужно будет группировать не толькоq.id
. вам придется присоединиться с помощьюu.id, firstname, lastname, username, q.id, user_id, title
3. @vol7ron q.id является ли первичный ключ, почему его недостаточно для group by?
4. @vol7ron: Не в MySQL. Это 100% корректный (MySQL) запрос, который возвращает то, что запрашивается.
5. (хотя я бы использовал:
users LEFT JOIN questions LEFT JOIN answers
чтобы также показывать пользователям, которые не задавали никаких вопросов.)
Ответ №2:
select users.fistname,users.lastname,users.username
from users, questions, answers
where users.id = questions.user_id and questions.id = answers.question_id
Комментарии:
1. Требование, возможно, не на 100% ясно, но я предполагаю, что все вопросы должны быть перечислены, даже если ни один пользователь на них не ответил. Исходя из этого, я считаю, что вам нужно несколько левых объединений, согласно @xdazz.
2. Все вопросы должны быть перечислены, но ваш запрос выдает избыточные вопросы. Да, даже ни один пользователь не ответил на него.