Есть несколько вещей, которые вы должны знать.
Первое - это то, что конструкция SQL JOIN по умолчанию, по сути, является перекрестным произведением, ограниченным предложением WHERE.Это означает, что он мультипликативный - вы получаете дублированные результаты, которые затем сокращаете.Вы также должны быть осторожны при наличии полей NULL.
Во-вторых, существует ключевое слово DISTINCT.Когда вы префиксом столбца в выделении, вы получите не более одного экземпляра определенного значения для этого столбца в результатах.Таким образом, согласно вашему запросу, «SELECT DISTINCT user.id FROM» устранит избыточность на стороне сервера.
Третий способ состоит в том, что правильный способ решения этой проблемы, вероятно, не использует оператор *
.,Я предлагаю:
SELECT user.id,username,email,subject FROM message m,user WHERE m.user_id=user.id AND user.status=1
Используется простой, понятный синтаксис неявного соединения, и он должен быть допустимым SQL на любом сервере.Я могу поручиться за это, работая с MySQL, по крайней мере.Кроме того, псевдоним таблицы 'message' обозначается как 'm'.
Как вы предполагаете, это уменьшит трафик с сервера SQL к вашей базе данных.
edit: если вы хотитеудалить «лишнюю» информацию электронной почты, вы не можете - вы должны сделать два разных запроса.Результаты SQL являются таблицами и должны быть прямоугольными, с заполнением всех известных значений.Нет такой же записи.
edit 2: Вам нужно только сделать два запроса.Например:
SELECT subject FROM message WHERE message.id IN (SELECT user.id FROM user WHERE status=1)
Это один запрос, который содержит вложенный запрос, поэтому он действительно совершает два обращения к базе данных.Но у него нет никаких программных циклов.