We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 31716
    • 61 Posts
    Добрый день!

    Спецы в MySQL, помогите, плиз, уже второй час торможу... smiley

    ПРЕАМБУЛА:
    Есть каталог, элементы которого задаются обычными документами MODx с соответствующим набором TV параметров. Например: Вес, стоимость, размер, тип, производитель и т.д.
    Фактически весь каталог выводиться просто с помощью Ditto.
    Но нужно теперь еще реализовать поиск по каталогу и быстрый.
    После нескольких экспериментов, стало очевидно, что для поиска желательно работать непосредственно с базой, а точнее с таблицей модикса: modx_site_tmplvar_contentvalues

    ЗАДАЧА:
    Нужно построить запрос (или несколько запросов) к таблице modx_site_tmplvar_contentvalues такой, что бы он выдал на гора список contentid, удовлетворяющих запросу на поиск.

    Т.е. я получаю поисковый запрос от пользователя, типа:
    $pricemax = $_POST[’pricemax’];
    $type = $_POST[’type’];
    ... и т.д. около 10 параметров

    Дальше мне нужно найти все документы, TV параметры которых удовлетворяют данному запросу с логикой AND. Вот тут мне нужно применить SELECT, но все торможу, как же его составить.... sad

    Дело в том, что таблица modx_site_tmplvar_contentvalues имеет структуру:
    id, tmplvarid, contentid, value
    где
    tmplvarid - id TV переменной
    contentid - id документа к которому принадлежит переменная
    value - значение переменной.

    Т.е. для каждого документа - в таблице несколько записей с описанием отдельной TV переменной.

    САМ ВОПРОС:
    Вот я и туплю страшно, как бы мне составить запрос к этой таблице, что бы получить список документов (contentid), по поисковому запросу типа (Price<10) AND (Size<10) AND (Manufacture LIKE ’Epson%’), если каждый из проверяемых параметров в скобках - разные записи в таблице? (Ну конечно, вместо Price, Size и т.д. - id соответствующих TV параметров)

    Это вообще в принципе возможно за один запрос? smiley

    С уважением, Владимир
      www.verseq.ru - необычный клавиатурный тренажер, уже через час вы сможете печатать вслепую. smiley
      www.taiso.ru - арт-группа Taiso Style (портфолио, правда до сих пор нет времени выложить за последних два года smiley )
      • 31716
      • 61 Posts
      Сделал такого монстра:

      (для двух параметров):
      ------------------------------
      SELECT contentid
      FROM
      (
      SELECT *
      FROM
      `modx_site_tmplvar_contentvalues`
      WHERE
      (`tmplvarid` =2 AND `value` <=100000)
      OR
      (`tmplvarid` =10 AND `value` LIKE ’Киевская%’)
      ) as material
      GROUP BY `contentid`
      HAVING count(*)=2;
      ------------------------------

      Вроде работает... Но может я какие подводные камни не заметил...

      Подскажите, грамотно хоть я этот запрос составил?

      С уважением, Владимир
        www.verseq.ru - необычный клавиатурный тренажер, уже через час вы сможете печатать вслепую. smiley
        www.taiso.ru - арт-группа Taiso Style (портфолио, правда до сих пор нет времени выложить за последних два года smiley )
        • 31716
        • 61 Posts
        Сделал следующего монстра, который в добавление к предыдущему еще и выдает документы, принадлежащие только конкретному родителю...

        ------------------------------------

        SELECT id, alias
        FROM
        `modx_site_content`,
        (
        SELECT contentid
        FROM
        (
        SELECT *
        FROM
        `modx_site_tmplvar_contentvalues`
        WHERE
        (`tmplvarid` =2 AND `value` <=100000)
        OR
        (`tmplvarid` =10 AND `value` LIKE ’Киевск%’)
        ) as material
        GROUP BY `contentid`
        HAVING count(*)=2
        ) as par
        WHERE
        (par.contentid=modx_site_content.id)
        AND
        (modx_site_content.parent=3)
          www.verseq.ru - необычный клавиатурный тренажер, уже через час вы сможете печатать вслепую. smiley
          www.taiso.ru - арт-группа Taiso Style (портфолио, правда до сих пор нет времени выложить за последних два года smiley )
          • 26586
          • 184 Posts
          этак вы батенька далеко зайдете =)
          вы же хотите список id документов получать, так и стройте его
          SELECT id
          FROM modx_site_content as doc
          # первый параметр
          JOIN modx_site_tmplvar_contentvalues as tv1 on doc.id=tv1.contentid and tv1.tmplvarid=2 and value<=100000
          # второй параметр
          JOIN modx_site_tmplvar_contentvalues as tv2 on doc.id=tv2.contentid and tv2.tmplvarid=10 and value LIKE 'Киевск%
          # проверяем родителя
          WHERE doc.parent=3
          GROUP BY `contentid`