2010-10-12 3 views
2

Итак, вот что я пытаюсь сделать. Мой босс хочет поставить все транспортные средства, которые у нас есть на нашей домашней странице, и произвольно вытащить 8 из них за раз. Способ настройки нашей схемы базы данных имеет продукты и категории в отдельных таблицах с использованием перекрестной ссылки для определения категории, в которой находится продукт. В таблице с категориями есть родитель, который является прямым идентификатором из другой категории. Итак, вот SQL, с которым я столкнулся.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 после выбора, но продукт все еще был выбран дважды.

Спасибо!

ответ

5

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

Ok прохлады! Я работал над этим еще и получил заказ от rand, который понял ... но он все еще дублировал. Вот тогда я понял, что у нас есть 2 продукта с одинаковым именем, одна и та же картина - только разные номера деталей ... если это имеет смысл :) В любом случае, я тоже попробую порядок! Спасибо! + –

0

я тянуть 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 
    ... 
+0

Я собирался опубликовать то же самое. Сначала выберите 8 продуктов, затем присоединитесь. –

+0

Хорошо! Мне это нравится. Будет ли это улучшать производительность? –

+0

@Nathan: Проверьте и сравните обе версии. –

0

Примечание: Джо бил меня за этот ответ, но я не был уверен, как поместить код в комментариях, так вот мой ответ.

Я не уверен, если 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

Прохладный! Спасибо, что я определенно собираюсь посмотреть на тестирование в обоих направлениях! Спасибо за вашу помощь. UPDATE: просто попробовал ... и, к сожалению, моя версия MySQL не поддерживает некоторые из функций вышеуказанных подзапросов. Определенно желаю, чтобы он работал, хотел попробовать: - / –

Смежные вопросы