当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>";

为了更好地进行分析,我有事务级销售数据,我想对这些数据进行一个非常简单的品牌级篮子分析/亲和力分析。
下面是实际的模式和示例工作数据。
在我的网页上,我会有一个下拉框,将选择一个品牌。为了这个问题的目的,“Brand1”。然后执行一个查询,其中列出了与下拉列表中所选品牌具有相同id的表中最常见的10个品牌。
基于数据的输出将是
brand2
brand4
brand3
brand5

这个表由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>";

以上返回“Brand2”5次。(我只使用小样本数据,比如在我的操作系统中)。问题是我的循环,因为它与建议的两种类型的查询相似。以下是供参考的架构:
--
-- Database: `transactions`
--

-- --------------------------------------------------------

--
-- Table structure for table `brand`
--

CREATE TABLE `brand` (
  `id` int(11) NOT NULL,
  `brand` varchar(25) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `brand`
--

INSERT INTO `brand` (`id`, `brand`) VALUES
(1, 'Brand1'),
(1, 'Brand1'),
(1, 'Brand2'),
(1, 'Brand3'),
(1, 'Brand4'),
(2, 'Brand1'),
(2, 'Brand2'),
(2, 'Brand3'),
(3, 'Brand1'),
(3, 'Brand2'),
(4, 'Brand1'),
(4, 'Brand2'),
(5, 'Brand1'),
(5, 'Brand2'),
(5, 'Brand4'),
(5, 'Brand5'),
(6, 'Brand2'),
(6, 'Brand3'),
(7, 'Brand1'),
(7, 'Brand2'),
(7, 'Brand3');

--
-- Indexes for dumped tables
--

--
-- Indexes for table `brand`
--
ALTER TABLE `brand`
  ADD KEY `brand` (`id`,`brand`) USING BTREE;

最佳答案

我会把它表达成

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所提到的,索引可以极大地提高性能。

关于php - 返回ID与变量相同的前10个最常见的值。 3m +行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34120307/

10-13 02:53