Php 需要获取与最小值(价格)相关的行的产品ID

Php 需要获取与最小值(价格)相关的行的产品ID,php,mysql,min,codeigniter-3,Php,Mysql,Min,Codeigniter 3,我试图从我们的数据库中获取产品列表,按模式和品牌分组,并使用MIN获取每个模式的最低价格,我使用codeIgniter 3中的查询生成器构建以下查询,该查询几乎可以根据需要工作,只是产品ID与最低价格的产品不匹配,因此,当你点击一个产品,而不是它去最低价格的产品,它会去另一个价格的产品,虽然从相同的品牌和模式 我知道我需要使用某种子查询,但到目前为止我尝试的所有方法似乎都无法返回正确数量的产品?我只是不知道如何将它应用到MYSQL或CodeIgniter3,任何帮助都将不胜感激。我目前正在php

我试图从我们的数据库中获取产品列表,按模式和品牌分组,并使用MIN获取每个模式的最低价格,我使用codeIgniter 3中的查询生成器构建以下查询,该查询几乎可以根据需要工作,只是产品ID与最低价格的产品不匹配,因此,当你点击一个产品,而不是它去最低价格的产品,它会去另一个价格的产品,虽然从相同的品牌和模式

我知道我需要使用某种子查询,但到目前为止我尝试的所有方法似乎都无法返回正确数量的产品?我只是不知道如何将它应用到MYSQL或CodeIgniter3,任何帮助都将不胜感激。我目前正在phpmyadmin中测试它,所以在这个阶段可以使用MYSQL示例

多谢各位

 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