Php 从另一个表的值中排序值

Php 从另一个表的值中排序值,php,mysql,Php,Mysql,我在这里的第一篇文章 我正在尝试将产品表中显示的值与产品类别表中的值进行排序 “我的产品”表包含以下字段: id | psku | pname | pdescription id | psku | subcategory | orderid 我的产品类别表包含以下字段: id | psku | pname | pdescription id | psku | subcategory | orderid 我正在构建的站点是一个小的eshop,它包含几个子类别。此时的设置允许我将1个产品添加

我在这里的第一篇文章

我正在尝试将产品表中显示的值与产品类别表中的值进行排序

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

id | psku | pname | pdescription
id | psku | subcategory | orderid
我的产品类别表包含以下字段:

id | psku | pname | pdescription
id | psku | subcategory | orderid
我正在构建的站点是一个小的eshop,它包含几个子类别。此时的设置允许我将1个产品添加到多个类别中

例如,产品sku#6001将分为两个子类别,化妆品和睫毛。然后,我的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
它似乎不起作用。尝试了其他一些组合,结果最差。产品显示,但不会按orderid排序

有没有人能找到解决这个问题的办法。如果需要,我可以提供样本数据


谢谢。

您需要先订购子类别名称,所以

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

请注意,我还删除了您的组,因为在结果中,每个PSKU只返回一次,并且您无法自信地预测将为多个类别中的PSKU返回哪个子类别。如果每个产品在subcategories表中都有一个条目,您可能希望将左连接更改为内部连接。

我已经查看了您创建的sampledata.php文件。我正在努力弄明白你想做什么。为什么要运行两个查询?当然,您可以通过单个查询获得相同的结果

第一个查询将返回一个PSKU列表,然后将其传递到第二个查询中-

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
如果您只是从products表中检索字段,那么您只需执行以下操作即可-

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

旁注:您可以通过更好的规范化来提高性能。为了你的理智。将
products.id
更改为
products.id
products\u categories.id
更改为
products\u categories.id
product\u categories.pksu
更改为
product\u categories.product\u id
。然后在product_id而不是pksu上加入。您的order by和group by子句中的
e2o_
前缀是什么?您好,对不起,前缀是什么。这是旧代码的遗留问题。忘了移除。谢谢你的解释。这样做是有道理的。更好地理解。@daespo为什么产品在没有它的情况下显示多次?你能举个例子吗?听起来不对。它所属类别的显示次数应尽可能多。您好。如果我发布一些样本数据会有帮助吗?测试站点位于:如果您查看子类别,您可能会看到我试图实现的目标。@daespo是的,一定会发布一些示例数据。你好,LixorVicar,再次感谢您的回复。我在这里上传了示例数据:我希望这足够了。期待您的回复。非常感谢。美丽的!正是我想要的。感谢您使查询更短、更清晰。奇妙的解决方案,非常快速的响应。也要感谢所有参与的人。干杯!