MySQL запрос запроса совета - PullRequest
       1

MySQL запрос запроса совета

1 голос
/ 13 октября 2011

Могу ли я получить помощь по этому запросу.Я объясню в деталях.Чтобы сделать это проще, я приведу пример с тегами и атрибутами HTML.

У меня есть 3 таблицы:

  • tbl1 - содержит все теги HTML (tagId, tagName)
  • tbl2 - содержит все доступные атрибуты, которые могут отображаться в тегах (attId, attName)
  • tbl3 - это таблица карт для tbl1 и tbl2 (tagId, attId)

Я хочу выбрать все атрибуты (и связанную информацию об атрибутах), которые относятся к выбранному тегу (в приведенном ниже примере идентификатор тега 4) и идентификатор тега.

Вот пример того, что я хотел бы получить из запроса:

attId  tagId   attName  
50     4       The name of the attribute with id 50
89     4       The name of the attribute with id 89
114    4       The name of the attribute with id 114

Ниже приведен мой запрос, но я считаю, что есть лучший способ.

SELECT tbl2.*, tbl3.tagId
FROM tbl2 JOIN tbl3 
WHERE tbl3.attId IN (
     SELECT tbl3.attId FROM tbl3 where tbl3.tagId=4
     )
AND tbl3.attIdd = tbl2.attId
GROUP BY tbl3.attId

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 13 октября 2011

Выпуск 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) 
1 голос
/ 13 октября 2011

Вместо этого вы можете сделать это следующим образом.

SELECT tbl2.*, tbl3.tagId
FROM tbl2 JOIN tbl3 
ON tbl3.attId = tbl2.attId
WHERE tbl2.tagId = <selected id>
GROUP BY tbl3.attId
0 голосов
/ 13 октября 2011
SELECT  tbl2.attId, tbl1.tagId, tbl2.attName FROM tbl3, tbl1, tbl2 
   WHERE tbl1.tagId = tbl3.tagId AND tbl2.attId = tbl3.attId AND tbl3.tagId = 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...