mysql – 创造性地使用GROUP_CONCAT来避免查询…可以检索记录组吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 创造性地使用GROUP_CONCAT来避免查询…可以检索记录组吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2545字,纯文字阅读大概需要4分钟。
内容图文
![mysql – 创造性地使用GROUP_CONCAT来避免查询…可以检索记录组吗?](/upload/InfoBanner/zyjiaocheng/909/02bb076e95704fe585f9332a26db07c1.jpg)
我运营一个网站,用户数量很少,我希望很快就会增长.我正在使用共享的Web托管服务,我无法在Web服务器上更改MySQL默认设置.我正在尝试最小化查询并找到一个重复的查询对(通过setTimeout到Ajax调用每10秒发生一次),其中GROUP_CONCAT可以帮助减少以下2个查询:
$logid = mysqli_real_escape_string($cxn, $_SESSION['login_id']);
$sql1 = mysqli_query($cxn, "SELECT COUNT(bid) AS count FROM table1 WHERE login_id = '$logid'");
$sql2 = mysqli_query($cxn, "SELECT cid FROM table2 WHERE (login_id1 = '$logid' OR login_id2 = '$login_id')");
一个查询:
SELECT COUNT(table1.bid) AS count,
GROUP_CONCAT(table2.cid) AS cidList
FROM table1
LEFT JOIN table2
ON (table1.login_id = table2.login_id1 OR table1.login_id = table2.login_id2)
WHERE table1.login_id = '$logid';
问题是group_concat_max_len默认设置为1024,我调用了我的共享托管服务,我无法更改它.上面查询中的每个table2.cid都是20个字符,所以(包括逗号分隔符)GROUP_CONCAT只能返回48个table2.cid记录,但我需要能够返回多达1000个.我已经知道我可以更改这个使用如下查询的默认限制:
SET SESSION group_concat_max_len = 1000000;
但这个添加的查询失败了目的,因为即使上面的两个查询被压缩到一个查询,我现在已经添加了这个最新的查询,所以每次进行Ajax调用时仍然会进行两次查询(并且我没有保存任何内容) ).
有没有办法集群GROUP_CONCAT,您可以在其中检索每个GROUP_CONCAT的一些记录(table2.cid)?例如,像(例如100条记录):
SELECT COUNT(table1.bid) AS count,
GROUP_CONCAT(table2.cid ORDER BY table2.cid LIMIT 0,47) AS cidList1,
GROUP_CONCAT(table2.cid ORDER BY table2.cid LIMIT 48,95) AS cidList2,
GROUP_CONCAT(table2.cid ORDER BY table2.cid LIMIT 96,99) AS cidList3
FROM table1
LEFT JOIN table2
ON (table1.login_id = table2.login_id1 OR table1.login_id = table2.login_id2)
WHERE table1.login_id = '$logid';
顺便说一下,我尝试了一个测试用例并且通过添加LIMIT查询失败,因为没有LIMIT返回正确的PHP回显字符串,并且使用LIMIT,返回一个空的PHP回显字符串以及错误日志消息:
PHP Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in
解决方法:
只需发出一个常规的SELECT table1.bid,table2.cid FROM ….如果bid永远不是NULL,则SELECT cid就足够了(在这种情况下,COUNT(bid)= COUNT(cid))
计算出价并加入应用程序层中的cid列表几乎是即时的.无论如何,以逗号分隔的cid列表的构建肯定属于该层.
至于出价的计算,这不太明显.如果你真的想让MySQL进行计数并仍然保存一个数据库调用,我宁愿做这样的事情:
SELECT COUNT(table1.bid) FROM table1 WHERE blah blah
UNION ALL
SELECT cid FROM table2 WHERE blah blah
但这是理论.说真的,不要那样做.
第二个想法,实际上有一个不太尴尬的解决方案:
SELECT COUNT(table1.bid), table2.cid FROM ...
GROUP BY table2.cid WITH ROLLUP
table2.cid为NULL的最后一行包含总计数.
内容总结
以上是互联网集市为您收集整理的mysql – 创造性地使用GROUP_CONCAT来避免查询…可以检索记录组吗?全部内容,希望文章能够帮你解决mysql – 创造性地使用GROUP_CONCAT来避免查询…可以检索记录组吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。