【问题标题】:Min() with INNER JOIN and Full-text-searchMin() 与 INNER JOIN 和全文搜索
【发布时间】:2016-11-10 15:27:17
【问题描述】:

所以我已经让以下查询正常工作,在“products_desc”列中搜索“test*”并在“prices”表中获取其所有价格。

SELECT products.id, prices.price, products.product_desc FROM products
INNER JOIN prices
ON prices.product_id = products.id
WHERE 
MATCH (products.product_desc) AGAINST ('test*' IN BOOLEAN MODE)

虽然“价格”表包含每个产品的多个价格,我只想获取每个产品的最低价格。我之前使用

过滤了价格
INNER JOIN ( 
    SELECT min(price) as price, prices.product_number as product_number FROM prices 
    WHERE prices.product_number LIKE'".$q."%'
    GROUP BY prices.product_number
) min_prices
  on prices.price = min_prices.price 
  and prices.product_number = min_prices.product_number

但这是我在 prices 表中使用 products_numbers 的时候(现在只有一个 product_id 列。

Products
id | product_desc
----------------------------------------
1  | product1
2  | product2  

Prices
id | product_id | price
------------------------------------------------
1  | 1          | 312
2  | 1          | 219 
3  | 2          | 312 
4  | 2          | 111 

此外,该表由 10+ 百万行组成,因此效率很重要 :)

编辑

如果我需要访问 min(prices.price) 行上的列值怎么办?

SELECT products.id, MIN(prices.price) as prices_price, prices.id as prices_id, products.product_desc, products.product_number, prices.supplier_id, suppliers.name FROM products
INNER JOIN prices
ON prices.product_id = products.id
INNER JOIN suppliers
ON prices.supplier_id = suppliers.id
WHERE 
MATCH (products.product_desc) AGAINST ('test*' IN BOOLEAN MODE)
GROUP BY prices.product_id

上面返回每个产品的最低价格,但其他列中的值也错误?

【问题讨论】:

    标签: php mysql inner-join min


    【解决方案1】:

    您可以为此使用GROUP BY,并使用MIN() group by 功能。

    GROUP BY用于对列中的值进行分组,并对列进行计算。

    在我们的例子中,我们希望将结果按 product_id 分组,因为它在第二个表中重复,并在第二个表的价格列上执行计算 (min())。

    这就是您的查询的样子:

    SELECT products.id, MIN(prices.price), products.product_desc FROM products
    INNER JOIN prices
    ON prices.product_id = products.id
    WHERE 
    MATCH (products.product_desc) AGAINST ('test*' IN BOOLEAN MODE)
    GROUP BY prices.product_id
    

    【讨论】:

    • 谢谢,但这效率很低。响应时间是 1.5 秒,以前使用我的旧查询是 0.05 秒。 product_desc 已编入索引。
    • hmm .. 可能您可以先在子查询中获取所有行,然后在外部查询中按 product_id 分组?我不确定这是否会大幅改变响应时间。
    • 好吧,愚蠢的我。我注意到 product_id 没有被索引。这样做将响应时间减少到 0.00013 秒。非常感谢!
    • 哦,我忘了,我想如果我们使用 JOINS 列必须被索引。
    • 对帖子做了一点修改。 :)
    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    相关资源
    最近更新 更多