Как создать вложенный запрос выбора в SQL - PullRequest
0 голосов
/ 18 июня 2011

Я пытаюсь создать раздел комментариев для веб-сайта,

Комментарии состоят из имени пользователя, адреса электронной почты и комментария.Я храню эти данные в таблице «комментариев»

CREATE TABLE `comments` (
  `commentid` int(5) NOT NULL auto_increment,
  `user` varchar(40) NOT NULL default '',
  `email` varchar(100) NOT NULL default '',
  `comment` text NOT NULL,
  PRIMARY KEY  (`commentid`)
)

Я хочу выполнить запрос, который собирает все эти данные, но также проверяет адрес электронной почты в таблице «пользователи», чтобы увидеть, существует ли он,Если это так, возьмите аватарку из таблицы «Разное».Если электронное письмо не существует в таблице «пользователи», оно просто остается пустым.

В данный момент с запросом, который я пробовал, он получает данные только из 3 таблиц, если электронное письмо существует в 'таблица пользователей.У меня есть еще один комментарий, который, как анонимный пользователь, остался, но он не захватывается запросом.

CREATE TABLE `users` (
  `userid` int(25) NOT NULL auto_increment,
  `email` varchar(255) NOT NULL default '',
  `username` varchar(25) NOT NULL default '',
  PRIMARY KEY  (`userid`)
)

CREATE TABLE `misc` (
  `miscid` int(4) NOT NULL auto_increment,
  `userid` varchar(3) NOT NULL default '',
  `avatar` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`miscid`)
)

Я почти уверен, что мне нужен вложенный выбор в качестве имени столбца, чтобы при наличии электронного письма оно отображалось там... если нет, то оставьте пустым.

РЕДАКТИРОВАТЬ:

Сделал структуру таблицы такой, какой она должна быть.

Это запрос, который я только что попробовал, но он отображает толькострока, которая имеет адрес электронной почты.должен быть другой без адреса электронной почты

SELECT c.comment, c.user, av.avatar
FROM comments c
INNER JOIN users u ON c.email = u.email
LEFT OUTER JOIN (

SELECT userid, avatar
FROM misc
) AS av ON av.userid = u.userid

Ответы [ 5 ]

1 голос
/ 18 июня 2011

Если я правильно понял вашу проблему, проблема в том, что вы используете INNER JOIN между comments и users, что означает, что он будет возвращать только совпадающие строки по электронной почте. Таким образом, причина, по которой он не возвращает комментарии без адресов электронной почты или несоответствующих адресов электронной почты.

Замените ВНУТРЕННЕЕ СОЕДИНЕНИЕ на ЛЕВОЕ СОЕДИНЕНИЕ. Попробуйте этот запрос:

SELECT `c`.`comment`, `c`.`user`, `m`.`avatar`
FROM `comments` `c`
LEFT JOIN `users` `u` ON `c`.`email` = `u`.`email`
LEFT JOIN `misc` `m` ON `m`.`userid` = `u`.`userid`;

Надеюсь, это поможет вам получить все комментарии.

0 голосов
/ 18 июня 2011

Нет, на самом деле вам нужно LEFT OUTER JOIN. Его назначение именно то, что вам нужно - при соединении двух (или трех) таблиц по какому-либо ключу, а левая таблица не имеет соответствующего ключа, ее столбцы заполняются значением NULL в наборе результатов для этого ключа.

0 голосов
/ 18 июня 2011
SELECT * FROM comments LEFT JOIN users   
ON users.email=comments.email 
0 голосов
/ 18 июня 2011

Не совсем уверен, что это именно то, что вы имеете в виду, но я думаю, вам просто нужны дополнительные столбцы в вашем запросе с адресом электронной почты (пустым, если недоступен) и аватаром (пустым, если недоступен), если вы правы, вы можетеработать с LEFT JOIN.

SELECT
   c.*,
   u.email,
   m.avatar
FROM
   comments as c LEFT JOIN
   users as u ON (u.userid = c.user) LEFT JOIN
   misc as m ON (m.miscid = u.userid)

Обратите внимание, что имена столбцов, которые вы используете, довольно странные и противоречивые;используйте только идентификатор имени для идентификатора столбца и ссылайтесь только на эти идентификаторы в других моделях.

0 голосов
/ 18 июня 2011

Не совсем уверен, какой у вас желаемый вывод, как вы получаете правильное разное для данного пользователя, но вот общая идея

SELECT userid, email, username, IF(email<>'',(SELECT avatar from misc where miscid = users.userid),null) avater FROM users;

это более читаемая версия

SELECT
  userid,
  email,
  username,
  IF(email<>''
    ,/*then*/(SELECT avatar from misc where miscid = users.userid)
    ,/*else*/null)
   as avater
FROM users;

Пожалуйста, предоставьте четкий список ваших таблиц и пример желаемого результата, и мы можем лучше помочь.

Последний желаемый пример вывода очень полезен при разработке операторов MySQL.

...