Выпуск 1
Вы выполняете перекрестное объединение, которое позже сводите к внутреннему объединению, помещая фильтр в предложение where
.
Это старый способ при использовании неявного синтаксиса соединения.
На большинстве SQL-диалектов (но не MySQL) это выдает ошибку.
Никогда не выполняйте объединение без предложения ON .
Если вы хотите сделать перекрестное соединение, используйте этот синтаксис: select * from a cross join b
Выпуск 2
Подвыбор действительно не нужен, вы можете просто выполнить тест внутри предложения where.
SELECT tbl2.*, tbl3.tagId
FROM tbl2
INNER JOIN tbl3 ON (tbl3.attIdd = tbl2.attId)
WHERE tbl3.tagId = 4
GROUP BY tbl3.attId
Выпуск 3a
Вы делаете группу с помощью tbl3.ATTid
, что в этом контексте аналогично созданию группы с помощью tbl2.attid
(из-за предложения ON (tbl3.attIdd = tbl2.attId)
)
Последнее имеет немного больше смысла, потому что вы делаете select tbl2.*
, а не select tbl3.*
Выпуск 3b
Если attId не является первичным или уникальным ключом для tbl2, то результат запроса будет неопределенным.
Это означает, что запрос выберет строку случайным образом из списка возможных строк с одинаковым attID
. Если вы не хотите этого, вам нужно будет включить предложение having
, которое выберет строку на основе некоторого критерия.
Пример
/*selects the most recent row per attID, instead of a random one*/
SELECT tbl2.*, tbl3.tagId
FROM tbl2
INNER JOIN tbl3 ON (tbl3.attIdd = tbl2.attId)
WHERE tbl3.tagId = 4
GROUP BY tbl2.attId
HAVING tbl2.dateadded = MAX(tabl2.dateadded)