SQL: сбор правых значений из объединения - PullRequest
1 голос
/ 13 апреля 2010

Допустим, у вопроса много тегов через таблицу соединений, называемую тегами. Я делаю соединение таким образом:

SELECT DISTINCT `questions`.id 
FROM `questions` 
 LEFT OUTER JOIN `taggings` 
  ON `taggings`.taggable_id = `questions`.id 
 LEFT OUTER JOIN `tags` 
  ON `tags`.id = `taggings`.tag_id 

Я хочу упорядочить результаты в соответствии с определенным именем тега, например, «фортепиано», чтобы пианино было вверху, а затем по всем остальным тегам в алфавитном порядке. В настоящее время я использую этот пункт заказа:

ORDER BY (tags.name = 'piano') desc, tags.name

Что идет совсем не так - первые результаты, которые я получаю, даже не помечены как «пианино». Я думаю, что моя проблема заключается в том, что мне нужно как-то сгруппировать имена тегов и выполнить мой тест на упорядоченность по этому поводу: я думаю, что выполнение этого с прямыми тегами. Name не работает из-за структуры результирующей таблицы соединений (она работает если я просто делаю простой выбор в таблице тегов), но я не могу понять, как это исправить.

благодарен за любые советы, макс.

РЕДАКТИРОВАТЬ - ответ Marcelo re COALESCE Большое спасибо Марсело - я не видел этого раньше. Надо читать API более правильно. Это действительно помогает, но только если я выберу также грубое предложение. То есть это:

SELECT DISTINCT `questions`.id 
FROM `questions` 
 LEFT OUTER JOIN `taggings` 
  ON `taggings`.taggable_id = `questions`.id 
 LEFT OUTER JOIN `tags` 
  ON `tags`.id = `taggings`.tag_id 
 ORDER BY (COALESCE(tags.name,'') = 'piano') desc, tags.name

все еще дает ложные результаты. Однако это:

SELECT DISTINCT `questions`.id, COALESCE(tags.name,'')
FROM `questions` 
 LEFT OUTER JOIN `taggings` 
  ON `taggings`.taggable_id = `questions`.id 
 LEFT OUTER JOIN `tags` 
  ON `tags`.id = `taggings`.tag_id 
 ORDER BY (COALESCE(tags.name,'') = 'piano') desc, tags.name

возвращает правильные результаты. Я все же хотел бы просто выбрать идентификаторы вопросов. В любом случае, все ближе ...

1 Ответ

2 голосов
/ 13 апреля 2010

Может быть потому, что tags.name = 'piano' оценивается как NULL, когда tags.name равно NULL. Попробуйте COALESCE(tags.name, '') = 'piano'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...