Как присоединиться к этим таблицам?

#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. Все вопросы должны быть перечислены, но ваш запрос выдает избыточные вопросы. Да, даже ни один пользователь не ответил на него.