2013-02-14 95 views
0

我有属于多个类别的产品。许多类别中的一个产品,从每个类别中找到n个产品 - php mysql

products   categories  products_categories 
------------  ------------- -------------------- 
product_id  category_id  product_id 
product_title category_title category_id 

我希望得到N多,可能是让我们说6,从每个类别的最后插入不同的产品。我也会加入一些产品来获取产品信息,但这应该很简单。

我从不同产品的意思是说,如果一个产品是属于很多类,它应该只有一次在一类和其他类别应该得到另一个N,6个款产品,如果有其他任何可用的。

我可以尝试像这里定义使用等级Select 2 products from each category in MySQL 但是当产品属于多个类别,该解决方案不处理的情况下,和我想要的产品在每个类别中不同的n个。

这里是一些样本数据

pid catid insertion_date 
284 48 2/4/2013 1:14:16 AM 
278 41 2/4/2013 1:25:03 PM 
278 43 2/4/2013 1:25:03 PM 
284 45 2/4/2013 12:55:24 PM 
284 44 2/4/2013 12:55:24 PM 
285 41 2/4/2013 1:28:37 AM 
278 42 2/4/2013 1:25:03 PM 
285 47 2/4/2013 1:28:42 AM 
285 48 2/4/2013 12:50:44 PM 
278 46 2/4/2013 1:25:03 PM 
278 47 2/4/2013 1:25:03 PM 
278 48 2/4/2013 1:25:03 PM 
286 43 2/7/2013 3:20:40 PM 
286 44 2/7/2013 3:20:40 PM 
243 41 2/14/2013 3:30:59 PM 
243 42 2/14/2013 3:30:59 PM 
243 43 2/14/2013 3:30:59 PM 
266 41 2/14/2013 3:51:40 PM 
266 47 2/14/2013 3:51:40 PM 
266 48 2/14/2013 3:51:40 PM 
286 41 2/14/2013 3:51:55 PM 
286 42 2/14/2013 3:51:55 PM 
286 45 2/14/2013 3:51:55 PM 
286 46 2/14/2013 3:51:55 PM 
286 47 2/14/2013 3:51:55 PM 
286 48 2/14/2013 3:51:55 PM 
254 41 2/14/2013 3:52:07 PM 
254 43 2/14/2013 3:52:07 PM 
254 45 2/14/2013 3:52:07 PM 
254 47 2/14/2013 3:52:07 PM 
254 48 2/14/2013 3:52:07 PM 
252 41 2/14/2013 3:52:23 PM 
252 42 2/14/2013 3:52:23 PM 
252 45 2/14/2013 3:52:23 PM 
252 46 2/14/2013 3:52:23 PM 
252 47 2/14/2013 3:52:23 PM 
252 48 2/14/2013 3:52:23 PM 
169 46 2/14/2013 3:55:54 PM 
221 46 2/14/2013 3:56:08 PM 

如果有人有一个更好的解决方案在PHP做这样的事情,请建议。

+0

给我们期望的结果样本数据,所以我们可以做得出来。 – 2013-02-14 14:59:11

+0

添加了示例数据。 – asm234 2013-02-14 15:10:43

回答

0

如果您需要重复取值一次,请参阅DISTINCT,它将返回给定列的唯一值的结果。

并获得最后插入的,ORDER BY,使用DESC

要限制你要多少行,LIMIT

因此,最终的查询是: SELECT DISTINCT product_id FROM products_categories ORDER BY product_id DESC LIMIT 6

编辑:尝试实际的方式你的意思是,迄今为止还不能得到正确的结果,但我相信这将是可行的JOIN,如何我目前无法形成它。稍后我会再看看这个,直到那时找到好运,我对这种输出也很好奇,所以将这个添加到的收藏夹

+0

这会给你6个结果,而不是每个类别6个结果。 – 2013-02-14 15:01:28

+0

相信我,这不是那么容易。您的查询将为所有类别提供不同的6条记录。我希望n,6,每个类别的产品,也只有最后6个插入的产品。 – asm234 2013-02-14 15:03:01

+0

看来我误解了,让我试试'那个'。 – TheDeadLike 2013-02-14 15:09:16

0

我的SQL有点生疏,但我想你可以使用NOT IN()来删除任何重复项。如果你有一个声明,让您的第一个6个款产品,然后使用类似:

WITH Statement1 as (SELECT .... FROM ....) -- Get your first 6 products 
WITH Statement2 as (SELECT ... FROM .... NOT IN (Statement1)) -- Get 6 new one, NOT in Statement1 
... and so on ... 

不是最漂亮的代码,但是你应该明白什么,我想说的概念。

要获得所有的结果,那么你可以创建一个视图来轻松获得他们:

CREATE VIEW AllProducts AS 
    Statement1 UNION Statement2 UNION ...; 

SELECT .... FROM AllProducts; 
+0

很难从您的建议中提出单个查询。你说的实际上是对我的问题的描述,而不是解决方案。我无法激发多个查询。 – asm234 2013-02-14 15:12:17

+0

使用WITH(正如我更新到),如果您只想要一个包含所有结果的列表,最终应该能够加入所有语句。 – 2013-02-14 15:14:32

+0

对不起,这是错误的。使用UNION你应该能够结合所有的语句。编辑我的帖子。 – 2013-02-14 15:17:12

1

这个例子将基于最新product_ID每一个category_title给你2最新product_title

SELECT a.category_title, c.product_title 
FROM categories a 
     INNER JOIN products_categories b 
      ON a.category_ID = b.category_ID 
     INNER JOIN products c 
      ON b.product_ID = c.product_ID 
WHERE 
     (
      SELECT COUNT(*) 
      FROM products_categories d 
      WHERE b.category_ID = d.category_ID AND 
        c.product_ID <= d.product_ID 
     ) <= 2 
+0

我认为它不好,没有你的产品进入多个类别,但我会在一段时间内重新检查并更新你。从数千条记录中获取这样的查询会好吗? – asm234 2013-02-14 15:31:22

+0

是的,它不够好,它会失败,如果你有产品分成多个类别,这是我的基本要求。我认为我们需要使用排名的解决方案,但不知道如何。 – asm234 2013-02-14 15:36:42

相关问题