Можно выбрать следующую запись в алфавитном порядке, но что происходит, когда имя записи совпадает? - PullRequest
1 голос
/ 10 марта 2011

С помощью этого sql я могу получить следующее имя в алфавитном порядке, используя идентификатор

SELECT id 
FROM `names` 
WHERE `name` > (SELECT `name` FROM `names` WHERE `id` = X) 
ORDER BY `name` ASC, `id` ASC

Однако давайте предположим, что у меня есть эти записи у меня есть

id | name
---------
12 | Alex
8  | Bert
13 | Bert
17 | Bert
4  | Chris

Скажите, что у меня естьс идентификатором 12 в качестве ссылки я получаю результаты

id | name
---------
8  | Bert
13 | Bert
17 | Bert
4  | Chris

Но если я буду использовать 8 в качестве ссылки, я получу

id | name
---------
4  | Chris

Берт 13 и 17 будут пропущены.

Ответы [ 3 ]

2 голосов
/ 09 июня 2011

Это может показаться очевидным, но если вы хотите упорядочить по 2 полям, таким как имя и фамилия, вам нужно будет объединить (CONCAT / CONCAT_WS) поля имени и фамилии, чтобы найти предыдущее или следующий результат. Если у вас совпадают имена, вы можете зацикливаться от одного имени к другому и обратно, чтобы предотвратить это, соединить идентификатор строки до конца объединенного имени и фамилии. Это будет работать лучше, чем тестирование, если идентификатор больше текущего идентификатора (OR n.names = q.name AND n.id > q.id), как если бы имена не были вставлены в алфавитном порядке, тогда вы пропустите разделы результатов (а не то, что требуется при переходе к следующему / предыдущему результату). Надеюсь, это кому-нибудь поможет.

1 голос
/ 10 марта 2011

Попробуйте условие, подобное этому:

WHERE `name` > (SELECT `name` FROM `names` WHERE `id` = X)
      OR `name` = (SELECT `name` FROM `names` WHERE `id` = X) AND `id` > X
1 голос
/ 10 марта 2011

Это потому, что вы сравниваете имена с оператором «больше чем», что исключает любые имена, равные.Если вы хотите продолжать уважать идентификатор:

SELECT n.id 
FROM names n
JOIN (SELECT name, id FROM names WHERE id = X) q
  ON n.id = q.id
WHERE n.name > q.name
   (OR n.names = q.name AND n.id > q.id)
ORDER BY n.name ASC, n.id ASC

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

...