上一篇
场景引入:
凌晨3点,你盯着屏幕上一堆逗号分隔的ID字符串发愁——"1,5,7,19,23",老板要你半小时内统计这些用户的订单数据,而你的SQL查询框里还写着WHERE id = 1 OR id = 5 OR...
😱 别慌!掌握MySQL数组查询技巧,从此告别手动拼接噩梦!
MySQL其实没有真正的数组类型(不像PostgreSQL),但我们可以用这些方式模拟:
-- 查询ID在"1,5,7"列表中的数据 SELECT * FROM users WHERE FIND_IN_SET(id, '1,5,7');
⚠️ 缺点:
-- 用UNION ALL动态构造虚拟表 SELECT * FROM products WHERE category_id IN ( SELECT 1 UNION ALL SELECT 5 UNION ALL SELECT 7 );
适合少量明确值,超过10个值会写到手抽筋 🤯
(MySQL 5.7+版本专属福利)
-- 检查JSON数组是否包含特定值 SELECT * FROM orders WHERE JSON_CONTAINS('[101,205,308]', CAST(order_id AS JSON));
-- 把JSON数组拆成多行(类似Excel的"分列") SELECT user_id, jt.item FROM users, JSON_TABLE( '[1,3,5]', '$[*]' COLUMNS (item INT PATH '$') ) AS jt;
输出效果:
user_id | item
--------+-----
1 | 1
1 | 3
1 | 5
-- PHP示例(其他语言逻辑类似) $ids = [3,9,27]; $placeholders = implode(',', array_fill(0, count($ids), '?')); $stmt = $pdo->prepare("SELECT * FROM logs WHERE user_id IN ($placeholders)"); $stmt->execute($ids);
✅ 优势:
不要用IN
接子查询:
-- 慢到怀疑人生 ❌ SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
改用JOIN
:
-- 闪电速度 ✅ SELECT t1.* FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id;
超长列表处理:
超过1000个值时分批查询(MySQL的IN
有长度限制)
MySQL 8.0的REGEXP
居然能当简易数组查询用:
-- 查询以1/3/5结尾的订单号 SELECT * FROM orders WHERE order_code REGEXP '[135]$';
(不过正则性能你懂的...慎用!)
:
IN
或临时表 下次再遇到"1,2,3"这种字符串,记得微微一笑:小样,看我分分钟拿捏你! 😎
本文由 须白梅 于2025-07-31发表在【云服务器提供商】,文中图片由(须白梅)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/491396.html
发表评论