SQL Выбор продуктов в одной категории - PullRequest
2 голосов
/ 12 октября 2010

Итак, вот что я пытаюсь сделать.Мой босс хочет разместить все машины, которые у нас есть, на нашей домашней странице и случайно вытащить 8 из них одновременно.При настройке схемы нашей базы данных продукты и категории в отдельных таблицах используют перекрестную ссылку для определения категории, к которой относится продукт.Таблица с категориями имеет родителя, который является прямым идентификатором из другой категории.Итак, вот SQL, который я придумал.

  SELECT      product.productID, 
              product.productSKU, 
              product.price, 
              product.name,
             product.stateInd, 
              category.parentID,
              category.categoryID,
              prod_cat.productID FROM category

LEFT JOIN prod_cat
     ON prod_cat.categoryID = category.categoryID
LEFT JOIN product
     ON product.productID = prod_cat.productID

WHERE category.parentID =  <cfqueryparam value="#catID#" cfsqltype="cf_sql_varchar" /> AND product.name <> "" AND RAND() 

LIMIT 8

Я надеюсь, что все имеет смысл.Мне просто тяжело не только потянуть 8 продуктов, но и убедиться, что эти 8 продуктов уникальны.О, и я попытался поставить DISTINCT после выбора, но продукт все еще был выбран дважды.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 12 октября 2010

DISTINCT должен работать.Если это не так, попробуйте group by productId.Чтобы выбрать случайные строки, упорядочите по rand() вместо конструкции where rand().

Объединение двух:

WHERE  category.parentID = <cfqueryparam value="#catID#" cfsqltype="cf_sql_varchar"/>
       AND product.name <> ""
GROUP BY
       product.productID
ORDER BY
       RAND() 
LIMIT  8
0 голосов
/ 12 октября 2010

ПРИМЕЧАНИЕ: Джо побил меня за этот ответ, но я не был уверен, как поместить код в комментарий, поэтому вот мой ответ.

Я не уверен, выдаст ли categoryID одну или несколько строкваш ввод, если это одна строка, вы можете очень хорошо использовать = вместо in

SELECT *
  FROM (SELECT * FROM product
         WHERE product.productID in (
            SELECT productID 
              FROM prod_cat
             WHERE categoryID in (  
                   SELECT categoryID 
                     FROM category 
                    WHERE parentID = 
                          <cfqueryparam 
                           value="#catID#" 
                           cfsqltype="cf_sql_varchar" /> 
                             )
               AND name <> ''
             ORDER BY rand()
             LIMIT 8
              ) p
INNER JOIN prod_cat ON p.productID=prod_cat.productID
INNER JOIN category ON prod_cat.categoryID=category.categoryID
0 голосов
/ 12 октября 2010

Я бы выбрал 8 уникальных продуктов в подзапросе, а затем использовал это в остальной части вашего запроса.

Очень грубый псевдокод:

select ...
    from (select 8 distinct random product IDs from product table) p
        left join prod_cat
           on p.productID = prod_cat.productID
        left join category
           on prod_cat.categoryID = category.categoryID
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...