SELECT 之后加入 Mysql

标签 mysql

我需要从项目列表中选择 50 个满足搜索条件的项目。 我还需要当前的销售数量。 商品列表超过10万条记录

这就是我现在所做的:

SELECT 
  items.id,
  CONCAT(prod_codes.code,items.item) AS item,
  items.price,
  sold.count
FROM items
LEFT JOIN prod_codes ON items.prod_code_id=prod_codes.id
LEFT JOIN (
    SELECT COUNT(*) AS count,CONCAT(prod_code,part_num) AS part 
    FROM `sold_items` 
    WHERE 1 
    GROUP BY CONCAT(prod_code,part_num)
    ORDER BY count DESC
) AS sold ON sold.part=CONCAT(prod_codes.code,items.item)
WHERE active_status=1
AND CONCAT(items.prod_code,items.item) collate utf8_general_ci LIKE '%".$search_part."%' 
AND items.description collate utf8_general_ci LIKE '%".$search_desc."%'

ORDER BY items.item

LIMIT 50

但是这个查询的执行时间超过 20 秒。我确信有更好的方法来做到这一点。

最佳答案

替换 WHERE 子句的这一部分

CONCAT(items.prod_code,items.item) collate utf8_general_ci LIKE '%".$search_part."%'

这样:

(items.prod_code collate utf8_general_ci LIKE '%".$search_part."%' OR items.item collate utf8_general_ci LIKE '%".$search_part."%')

CONCAT() 调用几乎肯定会使其陷入困境,因为它无法使用索引。

此外,您还存在 SQL 注入(inject)问题等 -- 使用 prepared statements .

最后看@ypercube的评论;这也是一个很好的观点,并且会产生很大的影响。

关于SELECT 之后加入 Mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19774740/

相关文章:

MySQL - 如何在名称后面显示昵称(如果有,则只是名称)?

php - $variable 和 %$variable% 有什么区别?

python - Python 中的持久 MySQL 连接

mysql - Git 存储库和数据库架构

mysql - 通过mysql还是rails在数据库之间传输记录更好?

mysql - 将表 1 中的一列左连接到表 2 中的两列

mysql - 在单个查询中获取不同日期范围的多列计数

python - 将用户名存储到 mysql [PYTHON]

MYSQL - 分组前左连接的最高值

mysql - 删除以前的条目并使用当前条目更新表 - mySql