Выборка и сортировка по первому символу одновременно нескольких полей

KillerMEN

Новичок
Выборка и сортировка по первому символу одновременно нескольких полей

Дана таблица “база игр” с полями name, name_rus, name_eng. + еще ~20 различных полей.

В поле name записывается название игры в стране производителе, в поле name_rus название в России и в поле name_ eng во всех остальных.

Нужно сделать сортировку по первым символам.

Вот к примеру, если нужно выгрузить все игры которые начинаются на латинскую букву A:

Искать пройдется также по полю name_rus так как некоторые игры в России могут называться по английски но не идут на экспорт, следовательно их нет в поле name_eng.
PHP:
SELECT * FROM table1
WHERE name_rus LIKE("A%") OR name_eng LIKE("A%")
ORDER BY name_rus, name_eng ASC
В данном случаи получится так что вначале будут отображены все игры которые найдены в поле name_rus а затем те которые в поле name_eng.

Как в данном случаи правильно организовать выборку данных ?
 

Gas

может по одной?
Если в лоб, то через 3 запроса склеенных union'ом и сортировкой получившегося результата.

Ну а если охота поизвращаться :) и алфавиты по которым сравнивается первая буква только русский и английский, то
для производительности поиска и сортировки можно завести ещё 2 поля, например, sort_name_eng и sort_name_rus (c индексами на них) в которых хранить по 5-10 первых символов соответствующего языка (что заносить определять по диапазонам кодов символов), чтоб искать и сортировать нужно было только по одному полю, по какому определять на стороне php.
 

KillerMEN

Новичок
Автор оригинала: Gas
Если в лоб, то через 3 запроса склеенных union'ом и сортировкой получившегося результата.
Как не пытался так и не получилось сделать с union'ом серовно получается что вначале выборка с одного поля отображается а затем со второго.

Автор оригинала: Gas
Ну а если охота поизвращаться :) и алфавиты по которым сравнивается первая буква только русский и английский, то
для производительности поиска и сортировки можно завести ещё 2 поля, например, sort_name_eng и sort_name_rus (c индексами на них) в которых хранить по 5-10 первых символов соответствующего языка (что заносить определять по диапазонам кодов символов), чтоб искать и сортировать нужно было только по одному полю, по какому определять на стороне php.
Мне здесь больше понравилась идея с отдельными полями для своего языка, если раньше в поле name_rus мог быть любой язык то в поле sort_name_rus будет заранее записано только название на русском как и с полем name_eng. Теперь осталось понять возможна ли ситуация когда игра забугром и в россии имеет разное название на английском :D
 

Gas

может по одной?
Как не пытался так и не получилось сделать с union'ом
показывай как пробовал.

Мне здесь больше понравилась идея с отдельными полями
Ну этот вариант я предложил для случая когда "прямой" запрос по нескольким полям тормозит, или просто в качестве альтернативы - "а можно ещё и так" :)
 

KillerMEN

Новичок
Автор оригинала: Gas
показывай как пробовал.
Да по разному. Вот к примеру:

Грубо говоря поле name не берем в расчёт.
PHP:
(SELECT * FROM table1 WHERE name_rus LIKE("A%"))
UNION
(SELECT * FROM table1 WHERE name_eng LIKE("A%"))
ORDER BY name_rus ASC
Если судить по документации то все должно быть так как я хочу.
 

Gas

может по одной?
(SELECT *, LEFT(name_rus, 5) AS name_sort ...)
UNION
(SELECT *, LEFT(name_eng, 5) AS name_sort ...)
ORDER BY name_sort

5 - количество символов по которым будет сортировка, можешь изменить
 

KillerMEN

Новичок
Gas
Вот спасибо ! :)

Только вот почему то не работает поиск по всему остальному, то есть игры которые начинаются с цифр и других знаков.
PHP:
WHERE name_rus NOT REGEXP("^[а-яА-Яa-zA-Z]")
Аналогично для name_eng
Выгружает почти всю базу и далеко не то что нужно, если делать по отдельности без union`а то выгружает то что нужно.

-~{}~ 16.10.08 21:30:

Я разобрался, дело в том что такая конструкция пропускает пустые значения, а в поле name такого быть не может вот там и было все нормально.


Большое спасибо за помощь !

-~{}~ 25.10.08 18:42:

Помогите заодно поиск до ума довести.

-~{}~ 25.10.08 18:49:

PHP:
SELECT *, 
MATCH name_rus AGAINST ('$query')
+MATCH name_eng AGAINST ('$query')
as relev FROM table1
WHERE MATCH name_rus AGAINST ('$query')>1 ORDER BY relev DESC
Поиск работает не корректно, в маленьких запросах когда к примеру 2 слова по три символа, не может найти. хотя в поле есть точное вхождение.
К слову LIKE тоже ничего найти не может.

-~{}~ 31.10.08 17:54:

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

-~{}~ 31.10.08 17:54:

Теперь такая проблема обнаружилась:

Если в поле name_rus и name_eng однинаковая релевантная запись, то выгружаются оба поля, как сделать чтобы выгружалось одно ?
PHP:
(SELECT *, LEFT(name_rus, 10) AS name_sort FROM table1 WHERE name_rus)
UNION
(SELECT *, LEFT(name_eng, 10) AS name_sort FROM table1 WHERE name_eng)
ORDER BY name_sort
 

Gas

может по одной?
select * from (твой нынешний запрос) as t group by _нужное поле_
 

KillerMEN

Новичок
Вот такая задача.

name_rus -> Th3 Plan: Идеальное ограбление
name_eng -> Th3 Plan

Пользователь жмёт кнопку отобразить игры на латинскую букву "T".
В результате получаем одну игру с двумя немного разными названиями.

Нам нужна только одна запись но неизвестно в каком она поле, игры на латинскую букву "T" могут быть как в том так и в другом поле.
 

Gas

может по одной?
как решить проблему я уже подсказал, единственное что последний "order by" нужно вынести из запроса с union'ами и поставить после group by.

из какого поля доставать название - определяй уже в php, после проверки: латинскую букву запросили или нет (если я правильно понял что если английскую, то из поля name_eng иначе name_rus).
 

KillerMEN

Новичок
Конкретные данные я так и сортирую в PHP здесь просто была проблема с дублями.

Тоесть запрос получается примерно такой:
PHP:
SELECT * FROM (
(SELECT *, LEFT(name_rus, 10) AS name_sort FROM table1 WHERE ...)
UNION
(SELECT *, LEFT(name_eng, 10) AS name_sort FROM table1 WHERE ...)
) as t group by name_rus, name_eng
ORDER BY name_sort
 
Сверху