У меня есть 3 таблицы со следующими данными:
Первая таблица называется соединениями, где connections.username1
является тем, кто следует, и connections.username2
является тем, за которым следует.
Он имеет следующие строки:
connections.username1 | connections.username2
mikha | guy
guy | maricela
maricela | guy
Вторая таблица называется вопросами. У него есть столбец для искателя под названием questions.asker_username
, а другой для того, кто получает вопрос под названием questions.target_username
. Когда азбуку называют "sys.tem" и целевой объект "every.one", он рассматривает глобальный вопрос и может быть ответен всеми членами.
Анонимные пользователи могут спросить, и их ip записывается как asker_username
.
Он имеет следующие строки:
questions.id | questions.asker_username | questions.target_username | questions.question
1 | mikha | guy | what your name?
2 | mikha | maricela | What your age?
3 | guy | mikha | what your name?
4 | maricela | guy | favorite food?
5 | xx.xx.xxx.xx | mikha | favorite pet?
6 | xx.xx.xxx.xx | guy | first name?
7 | xx.xx.xxx.xx | maricela | first name?
8 | sys.tem | every.one | what ur name?
9 | sys.tem | every.one | favorite movie?
10 | sys.tem | every.one | favorite game?
Третья таблица называется ответами. Идентификатор в таблице ответов совпадает с идентификатором вопроса. В этой таблице есть столбец для идентификатора и имени пользователя и ответа.
answers.id | answers.username | answers.answer
1 | guy | my name is guy
2 | maricela | my name is maricela
3 | mikha | my name is mikha
4 | guy | pizza
8 | guy | guy is my name
8 | maricela | maricela is my name
9 | maricela | avatar
Мне нужен запрос, который объединяет следующие условия, связанные с "mikha" и людьми, которых он следует:
1) questions.asker_username
НЕ "mikha"
2) questions.target_username
является либо "mikha" , либо любым из пользователей, которых он следует.
3) Если questions.target_username
равно "every.one" и отвечает "mikha" , покажите вопрос.
4) Если questions.target_username
равно "каждому" и отвечает любой из тех, кого "миха" следует, покажите вопрос и ответ. Если нет ответов пользователей, которых "mikha" следует, не показывайте вопрос.
5) Если questions.target_username
равно "every.one" и никому не отвечает, покажите вопрос один раз.
6) Если questions.target_username
равно "every.one" и на него не отвечает "mikha" и не отвечает ни один из людей, которых он следует, покажите этот вопрос только один раз.
Я использую следующий запрос:
SELECT questions.id,answers.id,questions.asker_username,questions.target_username,
answers.username,questions.question,answers.answer
FROM questions
LEFT JOIN answers ON (questions.id = answers.id)
LEFT JOIN connections ON connections.username1 = 'mikha'
AND (questions.target_username = connections.username2
OR questions.asker_username = connections.username2
OR connections.username2 = answers.username)
WHERE questions.asker_username <> 'mikha'
AND (questions.target_username = 'mikha'
OR questions.target_username = connections.username2
OR (questions.target_username = 'every.one'
AND (answers.username = 'mikha'
OR answers.username = connections.username2
OR answers.username IS NULL)
)
)
GROUP BY questions.id,answers.username
Ожидаемый результат:
questions.id | answers.id | questions.asker_username | questions.target_username | answers.username | questions.question | answers.answer
3 | 3 | guy | mikha | mikha | what your name? | my name is mikha
4 | 4 | maricela | guy | guy | favorite food? | pizza
5 | 5 | xx.xx.xxx.xx | mikha | NULL | favorite pet? | NULL
6 | 6 | xx.xx.xxx.xx | guy | NULL | first name? | NULL
8 | 8 | sys.tem | every.one | NULL | what ur name? | NULL
8 | 8 | sys.tem | every.one | guy | what ur name? | guy is my name
9 | 9 | sys.tem | every.one | NULL | favorite movie? | NULL
10 | 10 | sys.tem | every.one | NULL | favorite game? | NULL
В результате я получаю:
questions.id | answers.id | questions.asker_username | questions.target_username | answers.username | questions.question | answers.answer
3 | 3 | guy | mikha | mikha | what your name? | my name is mikha
4 | 4 | maricela | guy | guy | favorite food? | pizza
5 | 5 | xx.xx.xxx.xx | mikha | NULL | favorite pet? | NULL
6 | 6 | xx.xx.xxx.xx | guy | NULL | first name? | NULL
8 | 8 | sys.tem | every.one | guy | what ur name? | guy is my name
10 | 10 | sys.tem | every.one | NULL | favorite game? | NULL
Я построил схему http://sqlfiddle.com/#!2/29929e/1, чтобы показать результаты, которые я действительно получаю
Спасибо:)