kosola
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Репост отсюда Доброго времени, уважаемые знатоки Столкнулся с легкой, на первый взгляд, задачей, но вот все никак не могу найти достойного решения. Исходные данные: Две таблицы, связанные между собой: t1: uid, pid, originalname, language где uid - основной ключ, pid - айди родителя (из этой же таблицы), language - язык "документа" t2: uid, pid, title, language где uid - основной ключ, pid - t1.uid, title - заголовок, language - перевод заголовка В системе забиты 1-5 языков (динамически настраивается) На данной момент в первой таблице 14т записей, во второй 707т Задача: Вывести значения из первой таблицы, отсортированные по заголовку (т.е. по t1.originalname или t2.title). Причем с, так называемым, followback, т.е. для документа сначала берется текущий язык пользователя, если его нет, язык системы, потом любые другие языки, а если значение в t2 отсутствует, то брать originalname. Результат выводиться постранично. Что я делал: -Считывал все данные, собирал в массив, сортировал в пхп, выводил результат. Работает, но 80сек, это непростительно долго. -Пытался составить один большой запрос, но споткнулся на группировке. В результате GROUP BY t1.uid возвращается непонятно какая строка. Т.е. я составлял запрос, в котором выводятся все значения из t1 и t2, отсортированные по языку ("по важности языка"), но группировка берет не первое значение, а произвольное. запрос вида Код: SELECT t1.uid,t1.pid,t1.originalname,t1.language, t2.value,t2.language as lang, IF(t2.language='ru',0,IF(t2.language='en',1,IF(t2.language='de',2,IF(t2.language='in',3,IF(t2.language='oname',4,5))))) as lsort FROM t1 LEFT JOIN t2 ON t1.uid=t2.pid AND t2.language IN ("ru","en","de","in","oname") WHERE t1.uid IN ( subquery ) ORDER BY lsort asc | Условия с IF только для того, чтобы перевести языки в цифры по приоритетности, если можено сделать проще - буду рад. Результат, пример: 1, 1, ориг.имя.1, ру, перевод11, ру, 0 2, 2, ориг.имя.2, ру, перевод21, ру, 0 3, 3, ориг.имя.3, ру, перевод31, ру, 0 1, 1, ориг.имя.1, ру, перевод12, ен, 1 4, 4, ориг.имя.4, ру, перевод42, ен, 1 5, 5, ориг.имя.5, ру, перевод52, ен, 1 ... Т.е. если исключить повторения, так что бы остались значения с минимальным lsort, проблема была бы решена, ну или первая ее часть. вроде... Спасибо за внимание. надеюсь на Вашу помощь. |