如何为特定部门随机化产品?

时间:2013-01-19 20:19:35

标签: php mysql database

这是我的类别结构:

• Department
  • Category
    • Sub-Category

这是我的数据库:

enter image description here

我想显示来自特定部门的6个随机产品。例如,当用户去查看部门页面时,我只想要该部门中的所有产品。我遇到的问题是我无法找到一种只获得部门的方法,出于某种原因我只能从类别中获得产品......我需要再多一个级别。

这是我的SQL:

SELECT *
FROM products p
LEFT JOIN products_categories pc
ON p.product_id = pc.product_id
LEFT JOIN categories c
ON pc.category_id = c.category_id
WHERE c.category = 119
ORDER BY RAND()
LIMIT 6

119将是部门ID,但我的查询是空的,因为我不能那么远。

修改 我创建了一个SQLFiddle,让每个人都更轻松......非常酷的工具;)

http://sqlfiddle.com/#!2/964ed/3

编辑我想我需要更好地解释

所以我的三个类别很深;部门,类别和子类别。该部门没有与之相关的产品,所有产品都与子类别相关联。由于我的产品并没有直接与我的部门联系在一起,我如何能够查询将检索部门下的所有内容?我试图让所有东西都在枪支下,因为它拥有最多的产品。当我使用枪械id(119)查询时,我什么都没得到?但是,当我使用其中一个子类别ID时,我得到了结果?所以,我猜我需要做某种类型的子选择或什么,但不确定。希望能够解决问题:)

预期成果 使用119 category_id firearms,我希望得到以下记录:

(143, 131, 'single-shot')
(144, 131, 'semiautomatic')
(145, 131, 'bolt-action')
(146, 131, 'pump & lever action')
(171, 130, 'bolt-action')
(174, 136, 'safe')
(178, 130, 'single-shot')
(179, 130, 'pump & lever action')
(180, 130, 'semiautomatic')
(182, 181, 'shotgun ammunition')
(183, 181, 'rimfire ammunition')
(184, 181, 'centerfire ammunition')
(185, 181, 'handgun ammunition')
(186, 120, 'cooking')

3 个答案:

答案 0 :(得分:1)

尝试此请求和评论:由于您指定了部门ID,因此此处与leftinner join没有太大区别。我使用了自己的样本数据。

SQLFIDDLE DEMO

SELECT *
FROM product p
LEFT JOIN prod_categ pc
ON p.id = pc.pid
LEFT JOIN category c
ON pc.cid = c.id
WHERE c.id = 119
ORDER BY RAND()
LIMIT 6
;


| ID |    NAME | PID | CID |
----------------------------
|  1 |   ebook |   1 | 119 |
|  2 | artbook |   2 | 119 |

编辑:

查看您的示例数据,似乎交叉引用表中没有category 119products category。所以我尝试使用category id 182并根据您的示例数据更改了limit 2 ..

查询:

SELECT p.*, pc.category_id
FROM products p
LEFT JOIN products_categories pc
ON p.product_id = pc.product_id
LEFT JOIN categories c
ON pc.category_id = c.category_id
WHERE c.category_id = 182
ORDER BY RAND()
LIMIT 2
;

答案 1 :(得分:1)

答案 2 :(得分:0)

您可能需要使用派生表。请注意,您的WHERE条款会导致LEFT JOIN失败,因此您可以改为INNER JOIN,而不是这样:

SELECT *
FROM (
   SELECT *
   FROM products p
   INNER JOIN products_categories pc
   ON p.product_id = pc.product_id
   INNER JOIN categories c
   ON pc.category_id = c.category_id
   WHERE c.category = 119
   ) x
ORDER BY RAND()
LIMIT 6