Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » SQL+PHP сортировка+группировка

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

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, проблема была бы решена, ну или первая ее часть. вроде...
 
 
Спасибо за внимание. надеюсь на Вашу помощь.

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 02:45 19-07-2012
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kosola
подобные вопросы лучше задавать тут
MySQL Помогите составить запрос
на тему могут быть подписаны интересующиеся

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 02:53 19-07-2012
kosola



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо,  но я так же допускаю тот вариант, что запросом задача не решается и нужно с пхп колдовать. Поэтому разместился тут.  
нет так нет(((

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 10:01 19-07-2012
Kaylang



Вредный и упрямый
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kosola

Цитата:
но я так же допускаю тот вариант, что запросом задача не решается и нужно с пхп колдовать.

а чего там колдовать? определить на каком именно языке делать вывод и делать запрос в БД.

Всего записей: 38546 | Зарегистр. 29-08-2002 | Отправлено: 12:25 19-07-2012
kosola



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Все равно минимум два языка.  Либо я не понимаю о чем ты.
считываем все данные из таблиц, отсеиваем в пхп, сортируем в пхп. Это хорошо что у сервера выделено много памяти, а так бы вывалился бы с сообщением о переполнении.
Я хочу добиться того, что вся процедура займет 1-2 секунды. Это уже много. А учитывая то, что до этого идет еще подбор по параметрам, возможно так же поиск по like... вся эта тягомотина может очень долго выполнятся, не говоря уже про нагрузку.

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 13:35 19-07-2012
Kaylang



Вредный и упрямый
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kosola

Цитата:
считываем все данные из таблиц

Зачем?
Перепост из другой темы

Цитата:
 
Определяешь язык посетителя
$sql_lang_user = select (записи с языком посетителя)
if ($sql_lang_user)
{
выводим записи с языком посетителя ($sql_lang_user)
} else {
$sql_for_output = select (записи с дефолтным языком)
выводим записи с дефолтным языком
}
 

 
Добавлено:
И давай уже в одной какой-то теме обсуждать.

Всего записей: 38546 | Зарегистр. 29-08-2002 | Отправлено: 14:11 19-07-2012
kosola



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Зачем?
Перепост из другой темы  

хз. Cheery посоветовал в другой ветке написать.
 
 
Цитата:
Определяешь язык посетителя  

Нет, я уже ответил, что так очень долго.
 
составил такой красивый запрос

Код:
 
SELECT  
   t1.uid,
   IF(t2.title IS NULL OR t2.title='',t1.language,t2.language) as language,
   IF(t2.title IS NULL OR t2.title='',t1.originalname,t2.title) as title,
   IF(t2.title IS NULL OR t2.title='',0,1) as oname
 
FROM t1 LEFT JOIN t2 ON t1.uid=t2.pid AND  
   IF(t2.title<>'' AND t2.language='ru', t2.language='ru', IF(t2.title<>'' AND t2.language='en',1,0) )
 
WHERE 1
 

Если англ.языка нет, то показывает красиво, дефолтовый язык, если дефолтового нет, то показывает originalname, но если присутствуют оба языка, то он показывает две записи для одного t1.uid
Либо я не понимаю как IF работает и делаю что-то не правильно, либо я праильно понимаю как он работает, но все равно делаю что-то не правильно.
 
Кто знает как убрать дубли?
 
Пробовал так же с CASE, но как-то тоже не встало((
 
Добавлено:

Цитата:
И давай уже в одной какой-то теме обсуждать.  

давай) только я не знаю где, вроде как тут больше по SQL

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 14:39 19-07-2012
Kaylang



Вредный и упрямый
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kosola

Цитата:
составил такой красивый запрос  

тогда вкладывай IF или CASE друг в друга, чтобы при выполнении первого найденного условия пропускались остальные.

Всего записей: 38546 | Зарегистр. 29-08-2002 | Отправлено: 14:47 19-07-2012
kosola



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kaylang
Я вроде так и сделал

Код:
 IF(t2.title<>'' AND t2.language='ru', t2.language='ru', IF(t2.title<>'' AND t2.language='en',1,0) )  

Или это не верно? можешь написать как правильнО?

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 15:09 19-07-2012
Kaylang



Вредный и упрямый
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Попробуй так

Код:
 
IF(t2.title<>'' AND t2.language='ru', t2.language='ru', IF(t2.title<>'' AND t2.language='en', t2.language='en',0) )
 

Всего записей: 38546 | Зарегистр. 29-08-2002 | Отправлено: 16:00 19-07-2012 | Исправлено: Kaylang, 16:02 19-07-2012
kosola



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kaylang
Результат тот же.
 
Придется таки считывать все значения, благо хоть сортировать теперь в пхп не надо, так что процедура выполняется максимум 2с
 
Как решил: Использовал выше написанный запрос, Сортировка по title. Дальше считываю все значения, если значение уже было, но перевод есть более пододящий, тогда перезаписывать и вконце массива.
Т.о. получается отсортированный массив без повторений.
А дальше дело техники...  
Если буду предложения как можно исключить дубли запросом, буду рад.
 
Всем спасибо.

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 16:07 19-07-2012 | Исправлено: kosola, 16:08 19-07-2012
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » SQL+PHP сортировка+группировка


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru