Php 需要获取与最小值(价格)相关的行的产品ID
我试图从我们的数据库中获取产品列表,按模式和品牌分组,并使用MIN获取每个模式的最低价格,我使用codeIgniter 3中的查询生成器构建以下查询,该查询几乎可以根据需要工作,只是产品ID与最低价格的产品不匹配,因此,当你点击一个产品,而不是它去最低价格的产品,它会去另一个价格的产品,虽然从相同的品牌和模式 我知道我需要使用某种子查询,但到目前为止我尝试的所有方法似乎都无法返回正确数量的产品?我只是不知道如何将它应用到MYSQL或CodeIgniter3,任何帮助都将不胜感激。我目前正在phpmyadmin中测试它,所以在这个阶段可以使用MYSQL示例 多谢各位Php 需要获取与最小值(价格)相关的行的产品ID,php,mysql,min,codeigniter-3,Php,Mysql,Min,Codeigniter 3,我试图从我们的数据库中获取产品列表,按模式和品牌分组,并使用MIN获取每个模式的最低价格,我使用codeIgniter 3中的查询生成器构建以下查询,该查询几乎可以根据需要工作,只是产品ID与最低价格的产品不匹配,因此,当你点击一个产品,而不是它去最低价格的产品,它会去另一个价格的产品,虽然从相同的品牌和模式 我知道我需要使用某种子查询,但到目前为止我尝试的所有方法似乎都无法返回正确数量的产品?我只是不知道如何将它应用到MYSQL或CodeIgniter3,任何帮助都将不胜感激。我目前正在php
SELECT
`id` , `title` , `image` , `category` ,
MIN( price ) AS `price` , `rrp` , `product_to_category`.`product_id` ,
LEFT( short_description, 140 ) AS description,
`measurements` , `colour_names` , `colour_values` , `brand` , `pattern`
FROM `products`
JOIN `product_to_category` ON `id` = product_to_category`.`product_id`
LEFT JOIN `product_short_descriptions` ON `product_short_descriptions`.`product_id` = `id`
WHERE `category_id` =2 AND `status` = '1' AND `price` >= '102.30' AND `price` <= '804.10'
GROUP BY `pattern` , `brand`
ORDER BY `sort_order` , `price` ASC
LIMIT 40
注:添加物料以替代本例中的类别_id,因为类别2包含物料为713的所有产品
问题是我如何将我的2个连接添加到此中并保持结果不变,就像我尝试添加连接时一样,以及其他Where子句但保持相同的结果一样,当我尝试时,我只得到2个结果,而不是预期的12个结果,所以我猜我没有正确添加连接
SELECT `id`, `title`, `image`, `category`, price, `rrp`, `product_to_category`.`product_id`, LEFT(short_description, 140) as description, `measurements`, `colour_names`, `colour_values`, `brand`, `pattern`
FROM `products` p1
JOIN `product_to_category` ON `id` = `product_to_category`.`product_id`
JOIN `product_short_descriptions` ON `product_short_descriptions`.`product_id` = `id`
WHERE `category_id` = 2
AND price = (
SELECT MIN( price )
FROM products AS p2
WHERE p2.pattern = p1.pattern )
AND `status` = '1'
AND `price` >= '102.30'
AND `price` <= '804.10'
GROUP BY `pattern`, `brand`
ORDER BY `sort_order`, `price` ASC
LIMIT 40
猜测您的表结构,因此未经测试,如下所示:-
SELECT id ,
title ,
image ,
category ,
price ,
rrp ,
product_to_category.product_id ,
LEFT( short_description, 140 ) AS description,
measurements ,
colour_names ,
colour_values ,
brand ,
pattern
FROM
(
SELECT brand ,
pattern ,
SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY price), ',', 1) AS first_product_id
FROM products
WHERE status = '1'
AND price >= '102.30'
AND price <= '804.10'
GROUP BY pattern,
brand
) sub0
INNER JOIN products ON sub0.brand = products.brand AND sub0.pattern = products.pattern AND sub0.first_product_id = products.product_id
INNER JOIN product_to_category ON products.id = product_to_category.product_id
LEFT OUTER JOIN product_short_descriptions ON product_short_descriptions.product_id = products.id
WHERE product_to_category.category_id = 2
ORDER BY sort_order ,
price ASC
LIMIT 40
这是使用子查询查找每个品牌/模式中最便宜产品的id。它使用GROUP_CONCAT以价格顺序获取所有ID,然后使用SUBSTRING_INDEX获取第一个最便宜的ID。然后将其与其他表合并,以获得所有其他字段
前面的回答可能会帮助您了解聚合函数和分组方式是如何工作的,以及原始查询无法返回所需结果的原因:-
向我们展示示例数据和预期输出。请阅读,这里是一个学习如何提高你的问题质量和获得更好答案的好地方。你可能会误解MIN的工作原理。它将为group列获取该字段的最小值,但不是聚合字段或group by子句中的其他列来自未确定的行。它们可能来自具有最小值、最大值、第一个插入值或这些行中的任何其他值的行。获得2行的原因可能是GROUP BY子句。您可能只有两种图案和品牌组合。请列出表格声明和一些示例数据,您希望输出这些示例数据,然后我可以对其进行测试。目前我所能做的只是猜测,这非常无用,需要花费我很多时间。感谢您的帮助@kickstart,我将在有机会时查看是否可以将某些内容上载到SQLFiddle。感谢您的示例,我知道您说过它未经测试,但只是想让您知道,它在运行时在“where子句”中给出了未知列“category\u id”的错误PHPMyAdmin@Paul501-如果没有表声明,最好是一些示例数据,我就无法测试它。在本例中,我假设category_id位于products表上,因此在子查询中检查了它。如果你可以用表修改你的问题,我可以试着调试它。是的,对不起,category_id来自于被连接的products_to_category表。我已经对SQL进行了建模,但这仍然是一个猜测,因为我不知道其他列来自哪里。谢谢@Kickstart,我在上面添加了更多详细信息
SELECT `id` , `title` , `image` , `category` , price, `rrp` , `product_to_category`.`product_id` , LEFT( short_description, 140 ) AS description, `measurements` , `colour_names` , `colour_values` , `brand` , `pattern`
FROM `products` p1
JOIN `product_to_category` ON `id` = `product_to_category`.`product_id`
JOIN `product_short_descriptions` ON `product_short_descriptions`.`product_id` = `id`
WHERE `category_id` =2
AND price = (
SELECT MIN( price )
FROM products AS p2
JOIN product_to_category ptc ON id = ptc.product_id
WHERE p2.pattern = p1.pattern
AND category_id =2 )
AND `status` = '1'
GROUP BY `pattern` , `brand`
ORDER BY `sort_order` , `price` ASC
LIMIT 40
SELECT id ,
title ,
image ,
category ,
price ,
rrp ,
product_to_category.product_id ,
LEFT( short_description, 140 ) AS description,
measurements ,
colour_names ,
colour_values ,
brand ,
pattern
FROM
(
SELECT brand ,
pattern ,
SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY price), ',', 1) AS first_product_id
FROM products
WHERE status = '1'
AND price >= '102.30'
AND price <= '804.10'
GROUP BY pattern,
brand
) sub0
INNER JOIN products ON sub0.brand = products.brand AND sub0.pattern = products.pattern AND sub0.first_product_id = products.product_id
INNER JOIN product_to_category ON products.id = product_to_category.product_id
LEFT OUTER JOIN product_short_descriptions ON product_short_descriptions.product_id = products.id
WHERE product_to_category.category_id = 2
ORDER BY sort_order ,
price ASC
LIMIT 40