gpt4 book ai didi

mysql - 创造性地使用 GROUP_CONCAT 来避免查询...可以检索记录组吗?

转载 作者:可可西里 更新时间:2023-11-01 07:30:34 25 4
gpt4 key购买 nike

我经营的网站只有少量用户,我希望它能很快增长。我正在使用共享网络托管服务,我无法更改网络服务器上的 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) )

计算 bid 并加入应用层中的 cid 列表几乎是即时的。 cid 的逗号分隔列表的构建无论如何都属于这一层。

至于bid 的计数,不太明显。如果你真的想让 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.cidNULL,包含总计数。

关于mysql - 创造性地使用 GROUP_CONCAT 来避免查询...可以检索记录组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26143351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com