这是我的类别结构:
• Department
• Category
• Sub-Category
这是我的数据库:
我想显示来自特定部门的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')
答案 0 :(得分:1)
尝试此请求和评论:由于您指定了部门ID,因此此处与left
或inner join
没有太大区别。我使用了自己的样本数据。
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 119
:products 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)
我找到了一个可以解释我正在寻找的网站: http://code-slim-jim.blogspot.com/2010/06/mysql-find-grandparentsgrandchildren.html
答案 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