1

这是我的类别结构:

• 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

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

所以我有我的第三类深;部门、类别和子类别。该部门没有与之相关的产品,所有产品都与子类别相关联。由于我的产品与我的部门没有直接关联,我怎么能进行查询以检索部门下的所有内容?我正在尝试将所有东西都放在 Firearms 下,因为它拥有最多的产品。当我使用 Firearms id (119) 查询时,我什么也得不到?但是当我使用其中一个子类别 ID 时,我会得到结果吗?所以,我猜我需要做某种类型的子选择或其他东西,但不确定。希望这可以解决问题:)

预期结果 使用for 119,我想得到以下记录:category_idfirearms

(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')
4

3 回答 3

1

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

SQLFIDDLE 演示

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
;
于 2013-01-19T20:39:16.097 回答
1

我找到了一个网站,可以准确地解释我在寻找什么: http ://code-slim-jim.blogspot.com/2010/06/mysql-find-grandparentsgrandchildren.html

SQL 小提琴: http ://sqlfiddle.com/#!2/964ed/97

于 2013-01-21T18:41:36.383 回答
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
于 2013-01-19T20:30:23.733 回答