MySql Query: упорядочение по двум полям в двух таблицах - PullRequest
0 голосов
/ 30 января 2010

У меня есть две таблицы, хранящие данные членов

члены: id, field1, field2 и field3 ...

members_extra: memberId, someExtraField1 и someExtraField2

members_extra.memberId - это внешний ключ, ссылающийся на members.id

'members_extra' может иметь или не иметь связанные строки для строк в 'members'

скажем: у меня 1000 членов в 'members', и у меня есть 50 строк в 'members_extra', содержащих дополнительную информацию

теперь я хочу найти «членов» и упорядочить результаты в соответствии с «member.field2» ... но я хочу, чтобы участники, у которых есть дополнительная информация (в members_extra), были перечислены перед теми, у кого нет дополнительной информации

теперь я использую member.field3 как ENUM ('true', 'false'), который указывает, имеет ли этот член дополнительную информацию или нет, и упорядочивает следующим образом: ORDER BY field3 ASC, field2 ASC ... это работает нормально, но Мне не нравится такой подход, так как мне приходится обновлять members.field3 каждый раз, когда я вставляю или удаляю что-то из members_extra

как это сделать без использования members.field3?

спасибо

Ответы [ 4 ]

1 голос
/ 30 января 2010

Вы можете включить ORDER BY в зависимости от того, присутствует members_extra.memberId или нет:

SELECT *
FROM members
LEFT JOIN members_extra
ON members.id = members_extra.memberId
ORDER BY members_extra.memberId IS NULL, members.field2

Теперь вам не нужен members.field3, и вы можете удалить его из своей схемы. Это приблизит вашу базу данных к нормализованной форме.

0 голосов
/ 30 января 2010

ОГРОМНОЕ СПАСИБО

Это работает !!!

    SELECT * FROM members LEFT JOIN members_extra ON members.id = members_extra.memberId ORDER BY members_extra.memberId IS NULL, members.field2`enter code here`

Это дает ошибку:

SELECT members.id, members.field1, members_extra.someExtraField1,

Порядок = CASE members_extra.memberId КОГДА НУЛЬ ТО, ЧЕМ 'Z' ИЛИ ​​'A' КОНЕЦ ОТ ЧЛЕНОВ ЛЕВЫЕ ПРИСОЕДИНЯЮТ members_extra ON members.Id = members_extra.memberId ЗАКАЗАТЬ ПО ЗАКАЗУ

Это должно быть так:

Blockquote

SELECT members.id, members.field1, members_extra.someExtraField1,

CASE members_extra.memberId, Когда NULL THEN 1 ELSE 0 END КАК Заказ ОТ ЧЛЕНОВ ЛЕВЫЕ ПРИСОЕДИНЯЮТ members_extra ON members.Id = members_extra.memberId ЗАКАЗАТЬ ПО ЗАКАЗУ

Blockquote

Одна странная вещь, хотя ... когда я использую последний запрос, я всегда получаю ordering = 1 .. даже при том, что в members_extra

нет соответствующих строк
0 голосов
/ 30 января 2010
SELECT members.id, 
       members.field1, 
       members_extra.someExtraField1,
       Ordering = CASE members_extra.memberId WHEN NULL THEN 'Z' ELSE 'A' END 
   FROM members 
        LEFT JOIN 
        members_extra ON members.Id = members_extra.memberId
  ORDER BY Ordering
0 голосов
/ 30 января 2010
order by member_extra.something desc 

сначала, который, я думаю, будет содержать значения NULL после ненулевых, или

order by case when member_extra.something IS NOT NULL 1 else 2 end
...