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. Результат выводиться постранично. Примечание: в системе может быть один основной документ (t1.uid=t1.pid) и прицепленные, но не глубже одного уровня. В список будут выводиться только основные, но переводы должны смотреться и по вложенным. Впрочем это уже задание на 5+. Что я делал: -Считывал все данные, собирал в массив, сортировал в пхп, выводил результат. Работает, но 80сек, это непростительно долго. -Пытался составить один большой запрос, но споткнулся на группировке. В результате GROUP BY t1.uid возвращается непонятно какая строка. Т.е. я составлял запрос, в котором выводятся все значения из t1 и t2, отсортированные по языку ("по важности языка"), но группировка берет не первое значение, а произвольное. запрос вида SELECT t1.*, t2.title, t2.language as lang, (тут конвертация языков в числа) as sortlang FROM t1, t2 WHERE t1.uid=t2.pid ... ORDER BY sortlang (уже точно не помню, завтра на могу точнее написать) Результат, пример (допустим у пользователя русский, в системе английский): 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 ... Т.е. если исключить повторения, так что бы остались значения с минимальным sortlang, проблема была бы решена, ну или первая ее часть. вроде... Спасибо за внимание. надеюсь на Вашу помощь. |