ФорумРазработкаБазы данных → Теги и упорядочивание

Теги и упорядочивание

  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 13 ноября 2008 г. 8:08

    Нужно вытащить товары по тегу, при этом нужен пагинатор.

    Тащим все записи из таблицы тегов:
    if ($limit)
    $limit = ' LIMIT '.(($limit * PRODUCTS_IN_PAGE) - PRODUCTS_IN_PAGE).', '.PRODUCTS_IN_PAGE;
    else
    $limit = '';

    $this->db->sql_query('SELECT DISTINCT `product` FROM `'.KEYWORDS_TABLE.'` WHERE `word`="'.$this->db->escape_string($tag).'" ORDER BY `id` DESC'.$limit);

    Имеем запрос вида
    SELECT DISTINCT `product` FROM `my_keywords` WHERE `word`="слово" ORDER BY `id` DESC LIMIT 20, 20


    Дальше формируем запрос, чтобы вытащить инфу по записям:
    $where = '';

    while ($row = $this->db->fetchrow())
    $where .= '`key`="'.$row['product'].'" OR ';

    if ($where == '')
    return array();

    $where = substr($where, 0, -4);

    $result = $this->db->sql_query('SELECT * FROM `'.PRODUCTS_TABLE.'` WHERE '.$where);


    Все вроде бы нормально. Но засада в том, что нужно эти товары упорядочивать по имени. Если тупо добавить ORDER BY `name`, то упорядочиваться будет только текущая страница (текущие 20 товаров), а нужно упорядочивать именно все. Лимит во второй запрос пихать нельзя (во всяком случае, в данной ситуации), так как вернется пустой результат (оно и понятно).

    Вопрос: можно ли решить задачу средствами MySQL, или придется плясать с бубном, тянуть все товары по тегу без лимита и потом только упорядочивать по имени?
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 13 ноября 2008 г. 8:10, спустя 2 минуты 34 секунды

    мне кажется, что неверно построена схема товары-тэги…
    все умрут, а я изумруд
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 13 ноября 2008 г. 8:14, спустя 3 минуты 25 секунд


    – Структура таблицы `my_keywords`


    CREATE TABLE `my_keywords` (
    `id` int(11) NOT NULL auto_increment,
    `product` int(11) NOT NULL,
    `word` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


    Где product — айдишник товара. Я думаю, что хранить теги в отдельной таблице правильней, чем в таблице товаров :)
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 13 ноября 2008 г. 8:15, спустя 46 секунд

    Или ты намекаешь что в этой таблице нужно хранить больше, чем только айдишник?
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 13 ноября 2008 г. 8:37, спустя 22 минуты 28 секунд

    sap, ссорь, не совсем понял, но не проще ли тянуть всё join'ом?
    adw/0
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 13 ноября 2008 г. 8:40, спустя 2 минуты 37 секунд

    adw0rd, да, но я не вьезжаю как :-[ Потому и спрашиваю совета :)
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 13 ноября 2008 г. 8:40, спустя 28 секунд


    Где product — айдишник товара. Я думаю, что хранить теги в отдельной таблице правильней, чем в таблице товаров :)
    да что-ты, рыба моя? :)

    3 таблицы должно быть
    все умрут, а я изумруд
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 13 ноября 2008 г. 8:42, спустя 1 минуту 41 секунду

    			$query = "SELECT …
    FROM `" . db::table('topics') . "`AS T
    JOIN `" . db::table('topics-tags') . "` AS TT
    ON T.`id`=TT.`topic_id`
    JOIN `" . db::table('tags') . "` AS TA
    ON TT.`tag_id`=TA.`id`
    WHERE TA.`tag`='{$tag}'
    ORDER BY T.`date` DESC
    LIMIT {$pager['start']}, {$perpage}";
    $sql = db::query($query) or db::error(__FILE__, __LINE__, mysql_error());

    вот пример вытаскивания топиков, по названию тэгов
    все умрут, а я изумруд
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 13 ноября 2008 г. 8:44, спустя 2 минуты 41 секунду

    Ну у меня три, только третья тут не учавствует, в ней хранится статистика тегов.
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 13 ноября 2008 г. 8:45, спустя 42 секунды

    За запрос спасибо, сейчас попробую сделать…
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 13 ноября 2008 г. 8:52, спустя 7 минут 2 секунды


    Ну у меня три, только третья тут не учавствует, в ней хранится статистика тегов.
    Какая статистика нафек …
    Тут типичное "многое ко многим". в третьей таблице должна хранится связь ИД-тега, ИД-товара
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 13 ноября 2008 г. 9:02, спустя 9 минут 20 секунд

    мы вроде уже где-то обсуждали как делать теги и лефтджоин-запросы к ним?
    adw/0
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 13 ноября 2008 г. 9:03, спустя 1 минуту 34 секунды

    Кстати, чтоб нормально проектировать БД я уже неоднократно призывал пользоваться специальным софтом.
    Для получения SQL скрипта с помощью Повер-Дизайнера, со всеми индексами и констрейнтами ушло несколько минут для данной задачи.

    Смотрите картинки:
    1. Строим концептуальную модель, определяем связь многое ко многим.
    2. Генерируем физическую модель для необходимой СУБД.
    3. Генерируем SQL скрипт.

    ЗЫ. Эдворд, сорри за нелицензионный PD. )))
    1. pd1.jpg (170)
    2. pd2.jpg (168)
    3. pd3.jpg (149)
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 13 ноября 2008 г. 9:13, спустя 10 минут 8 секунд

    Тут типичное "многое ко многим". в третьей таблице должна хранится связь ИД-тега, ИД-товара

    То есть, одна таблица, в которой только тег и его ид, и вторая таблица, в которой ид тега и ид товара? Зачем? Чтобы в таблице тегов теги не повторялись?

    мы вроде уже где-то обсуждали как делать теги и лефтджоин-запросы к ним?

    Я не нашел :(
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 13 ноября 2008 г. 9:15, спустя 2 минуты 15 секунд

    Я знаю, что такое «многие-ко-многим», и использовал это. Но не вижу смысла плодить сущности в данном случае, так как практической пользы от этого не вижу. Поясню: в этом же проекте делал возможность относить один товар к нескольким категориям. Тут да, однозначно нужно таблица для связей. А для тегов, как мне кажется, она не нужна потому, что у тегов нет никаких свойств (в отличии от категории), кроме самого тега.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!