Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Запрос (Clops) 09/09/2003 - 17:48:41
      Re: Запрос (Валентин) 10/09/2003 - 11:01:31
      Re: Запрос (clops) 10/09/2003 - 12:58:59
      Re: Запрос (Валентин) 10/09/2003 - 13:20:19
      Re: Запрос (clops) 10/09/2003 - 13:30:20
      Re: Запрос (Валентин) 11/09/2003 - 01:52:58

> Original message text:
> From: Clops - 09/09/2003 - 17:48:41
> Subject:Запрос
> -----------------
> Значится так, дамы и господа, в моём относительно простеньком движке есть система версий документов, которую я использую для создания многоязычный сайтов. Логика простая, при запросе страницы я проверяю, есть ли странница в СУБД на запрашиваемом языке, если нет, то выдаю дефолтную. При работе с отдельными страницами – это просто. Более сложные задачи это:
>
> * Постройка Меню
>
> * Постройка «breadcrumbs»
>
> * Списки материалов
>
> Например, не все части сайта будут переведены, а посему меню надо будет составлять из разных языковых контентов. Та же проблема касается построения карты сайта.
>
> Несущей таблицей системы является таблица-стрелочник, со следующей структурой:
>
> Create table nodemap(nodeid int unsigned NOT NULL, version int unsigned NOT NULL, object int unsigned NOT NULL, description varchar(255) NOT NULL DEFAULT ‘n/a’);
>
> Предположим, что в ней находится следующий контент:
>
> +--------+---------+--------+-------------+
> | nodeid | version | object | description |
> +--------+---------+--------+-------------+
> | 1 | 1 | 1 | about us |
> | 1 | 2 | 2 | про нас |
> | 2 | 1 | 3 | clients |
> | 3 | 1 | 4 | products |
> | 3 | 2 | 5 | решения |
> | 4 | 1 | 6 | contacts |
> +--------+---------+--------+-------------+
>
> Задача такова, что надо одним запросом получить записи из таблицы с уникальными nodeid отдавая приоритет версии 2, в случае её отсутствия возвращать запись версии 1. Пока мне в голову пришло только такое решение:
>
> SELECT DISTINCT a.nodeid, IF(b.version IS NULL,a.version ,b.version), IF(b.version IS NULL,a.object,b.object), IF(b.version IS NULL,a.description ,b.description) FROM `nodemap` a LEFT JOIN `nodemap` b ON (b.nodeid = a.nodeid AND b.version = 2)
>
> Но, думаю, понятно, что данное решение начнёт давать плохие результаты при, скажем, 50 000 записях в таблице. Может кто знает как это сделать с помощью простой группировки данных?
>


From: Валентин - 10/09/2003 - 13:20:19
Subject:Запрос
-----------------
Для того чтобы убрать distinct нужно просто объединение, а не левое объединение, это отсечет из a все несовпадающие с b ноды.

Кроме того оптимизируйте поля таблицы, какой например тип у version,nodeid и object ???


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
10603



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |