2
« : 09 Сентября 2003, 17:51:56 »
Значится так, дамы и господа, в моём относительно простеньком движке есть система версий документов, которую я использую для создания многоязычный сайтов. Логика простая, при запросе страницы я проверяю, есть ли странница в СУБД на запрашиваемом языке, если нет, то выдаю дефолтную. При работе с отдельными страницами – это просто. Более сложные задачи это:
* Постройка Меню
* Постройка «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 записях в таблице. Может кто знает как это сделать с помощью простой группировки данных?