Допустим, у вопроса много тегов через таблицу соединений, называемую тегами. Я делаю соединение таким образом:
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
возвращает правильные результаты. Я все же хотел бы просто выбрать идентификаторы вопросов. В любом случае, все ближе ...