2012-04-14 123 views
0

我的第一篇文章在这里。对来自其他表格的值进行排序php

我想将我的产品表中显示的值与我的products_categories表中的值进行排序。

我的产品表中包含以下字段:

id | psku | pname | pdescription 

我products_categories表具有以下字段:

id | psku | subcategory | orderid 

我建立这个网站是一个小型的网上商店,其中包含几个子类。此时的设置允许我将1个产品添加到多个类别。

例如,产品SKU#6001将被列在2个子类别中,化妆品&睫毛。我会再2在我products_subcategories表项,像这样:

id | psku | subcategory | orderid 
1 | 6001 | cosmetics | 1 
2 | 6004 | eyelashes | 1 
3 | 6003 | cosmetics | 2 
4 | 6011 | cosmetics | 3 
5 | 6020 | eyelashes | 2 
6 | 6045 | cosmetics | 4 

我目前使用下面的查询,以显示每个子类数据:

SELECT * FROM products LEFT JOIN products_subcategories 
ON products.psku = products_subcategories.psku 
WHERE products.psku IN ('6001','6003','6011','6020','6045') 
GROUP BY e2o_products_subcategories.psku 
ORDER BY e2o_products_subcategories.orderid ASC 

这应该显示我的结果是这样:

Cosmetics: 
PSKU 6001 
PSKU 6003 
PSKU 6011 
PSKU 6045 

eyelashes: 
PSKU 6004 
PSKU 6020 

它似乎没有工作。尝试了一些其他组合,结果最差。该产品显示,但不会按排序

有人会有一个可能的解决方案来解决这个问题。如果需要,我可以提供样本数据。

谢谢。

+0

备注:你可以提高性能与b etter标准化。为了您的理智,以及。将'products.id'更改为'products.product_id',将'products_categories.id'更改为'products_categories。product_category_id'和'product_categories.pksu'到'product_categories.product_id'。然后加入product_id而不是pksu。 – 2012-04-14 07:03:52

+0

您的订单中的'e2o_'前缀和group by子句是什么? – kjones 2012-04-14 07:04:15

+0

嗨,抱歉的前缀。这是来自旧代码的剩余部分。忘了删除。感谢您的解释。这样做是有道理的。更好地理解。 – daespo 2012-04-14 08:06:41

回答

1

我看了一下你创建的sampledata.php文件。我正在努力弄清楚你正在尝试做什么。你为什么运行两个查询?当然,您可以通过一个查询来获得相同的结果。

你的第一个查询将返回pskus你,然后传递到第二个查询列表 -

SELECT psku, subcategory 
FROM products_subcategories 
WHERE subcategory = 'cosmetics' 

+------+-------------+ 
| psku | subcategory | 
+------+-------------+ 
| 6018 | cosmetics | 
| 6017 | cosmetics | 
| 6022 | cosmetics | 
| 6025 | cosmetics | 
+------+-------------+ 

第二个查询是那么 -

SELECT DISTINCT products.* 
FROM e2o_products 
INNER JOIN e2o_products_subcategories 
    ON e2o_products.psku = e2o_products_subcategories.psku 
WHERE e2o_products.pstatus = '1' 
AND e2o_products.psku IN (6018,6017,6022,6025) 
GROUP BY e2o_products.psku 
ORDER BY e2o_products_subcategories.dsporder DESC 

既然你只检索产品表中的字段,你可以做 -

SELECT p.* 
FROM products p 
INNER JOIN products_subcategories ps 
    ON p.psku = ps.psku 
WHERE p.pstatus = 1 
AND ps.subcategory = '$subcat' 
ORDER BY ps.dsporder DESC 
+0

美丽!正是我想要的。感谢您使查询更短,更清洁。神奇的解决方案,非常快速的响应。也感谢所有其他参与者。 干杯! – daespo 2012-04-14 12:23:46

1

你需要订购的子类的名头,所以

SELECT * FROM products 
    LEFT JOIN products_subcategories 
    ON products.psku = products_subcategories.psku 
WHERE products.psku IN ('6001','6003','6011','6020','6045') 
ORDER BY e2o_products_subcategories.subcategory ASC, 
     e2o_products_subcategories.orderid ASC 

注意我还删除您GROUP BY与它,你将只能得到每PSKU在结果返回一次,你不会自信地能够预测在多个类别中将为PSKU返回哪个子类别。如果每个产品在子类别表中都有一个条目,则可能需要将LEFT JOIN更改为INNER JOIN。

+0

@daespo为什么产品没有它多次显示?你能举一个例子吗?这听起来不对。它应该显示与其所属类别相同的次数。 – liquorvicar 2012-04-14 08:13:00

+0

嗨。如果我张贴一些样本数据会有帮助吗? 测试网站是:http://e2o.aiiic.com 如果你看看子类别,你可能会看到我想要完成的。 – daespo 2012-04-14 09:35:37

+0

@daespo是的,绝对发布一些示例数据。 – liquorvicar 2012-04-14 09:44:50

相关问题