Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 返回与变量id相同的前10个最常出现的值。3m+行_Php_Mysql_Sql - Fatal编程技术网

Php 返回与变量id相同的前10个最常出现的值。3m+行

Php 返回与变量id相同的前10个最常出现的值。3m+行,php,mysql,sql,Php,Mysql,Sql,当while循环是打印结果的正确选项时,我正在使用for循环。非常感谢大家在下面的发言。。我留下了下面的所有步骤供参考,但这里是解决方案和工作代码。现在来清理我的数据,看看这是如何与我的“不太大”的数据运行呵呵 $db = new PDO($dsn, $db_user, $db_pass); $query = $db->prepare("SELECT brand FROM transactions WHERE id IN (SELECT id FROM transactions WHE

当while循环是打印结果的正确选项时,我正在使用for循环。非常感谢大家在下面的发言。。我留下了下面的所有步骤供参考,但这里是解决方案和工作代码。现在来清理我的数据,看看这是如何与我的“不太大”的数据运行呵呵

$db = new PDO($dsn, $db_user, $db_pass);
$query = $db->prepare("SELECT brand
FROM transactions
WHERE
  id IN (SELECT id FROM transactions WHERE brand = :brand1)
    AND brand <> :brand1
GROUP BY brand
ORDER BY COUNT(*) DESC
LIMIT 10");
$query->bindparam(":brand1", $brand);
$query->execute();

echo "<table>";


while($row = $query->fetch(PDO::FETCH_ASSOC)) {
    echo "<tr><td>".$row['brand']."</td</tr>";

}

echo "</table>";
该表由300万行组成,因此我认为无法将该部分加载到内存中。但即使是查询本身,我也很容易知道如何检索表中前10个最频繁的值。但是,基于它是否与变量共享和id来执行此操作超出了我当前的技能水平

因此,我呼吁各位专家帮助我迈出下一步,使用php/mysql处理大数据。我怎么能说出这样的疑问

编辑::尝试1

$brand = "Brand1";


$db = new PDO($dsn, $db_user, $db_pass);
$query = $db->prepare("SELECT brand
FROM brand
WHERE
  id IN (SELECT id FROM brand WHERE brand = :brand1)
    AND brand <> :brand1
GROUP BY brand
ORDER BY COUNT(*) DESC
LIMIT 10");
$query->bindparam(":brand1", $brand);
$query->execute();
$row = $query->fetch(PDO::FETCH_ASSOC);

echo "<table>";


for($i=0;$i<10;$i++) {
    echo "<tr><td>".$row['brand']."</td</tr>";
    $i++;
}

echo "</table>";

在SQL中,可以将其表示为:

select b.brand
from brand b join
     brand b1
     on b.id = b1.id and b1.brand = 1 and b1.brand <> b.brand
group by b.brand
order by count(*) desc
limit 10;
您将从brandbrand、id和brandid的索引中获得一些性能方面的好处


根据数据和用户需求,我不确定您是否能从该查询中获得所需的性能。但是,首先让逻辑起作用,然后再提高性能。

下面的SQL查询表示只返回10条记录,从记录16偏移量15开始:

SELECT * FROM <YOURTABLE> LIMIT 10 OFFSET 15
我可以这样说

SELECT brand
FROM brand
WHERE
  id IN (SELECT id FROM brand WHERE brand = 'brand1')
    AND brand <> 'brand1'
GROUP BY brand
ORDER BY COUNT(*) DESC
LIMIT 10;
这样可以避免加入的成本,并删除用户选择的品牌,该品牌不会出现在示例结果集中


正如Gondon Linoff所提到的,索引可能会极大地提高性能。

为什么您认为无法将该批次加载到内存中?300万行通常不被视为大数据。删除第一次获取和放置,而$row=$query->fetchPDO::fetch\u ASSOC{而不是for循环。看看Gordon Linoff的queryI,我已经尝试用上面的代码和要打印的循环来实现这个答案,但是我只得到了Brand2 5次。非常感谢你的回复。尝试直接对数据库运行查询。如果它返回了正确的值,问题就出在显示结果的代码中。如果我如果不是,则需要重新处理查询。正确!因此,查询非常完美,这是我的代码。;thx+1用于建议性能索引。肯定会使用它。您的查询确实有效,但它也显示了所选品牌。
SELECT * FROM <YOURTABLE> LIMIT 10 OFFSET 15
SELECT brand
FROM brand
WHERE
  id IN (SELECT id FROM brand WHERE brand = 'brand1')
    AND brand <> 'brand1'
GROUP BY brand
ORDER BY COUNT(*) DESC
LIMIT 10;