作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑::已解决 当 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>";
为了更好地理解,我有交易级别的销售数据,我想对其进行非常简单的品牌级别购物篮分析/亲和性分析。
EDIT::下面是实际架构和示例工作数据。
在我的页面上,我将有一个下拉框来选择一个品牌。出于这个问题的目的,'Brand1'。然后执行一个查询,列出前 10 个最常出现的品牌,这些品牌也出现在表格中,其 ID 与下拉列表中选择的品牌相同。
基于数据的输出将是
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 次。 (我只使用像我的 OP 中那样的小样本数据)。问题是我的循环吗,因为它与建议的两种查询类型相似。这是供引用的架构:
--
-- 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;
这避免了 JOIN 的成本,并删除了未出现在您的示例结果集中的用户选择的品牌。
正如 Gondon Linoff 所提到的,索引可能会大大提高性能。
关于php - 返回与变量相同的 id 的前 10 个最常出现的值。 300 万行以上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34120307/
我是一名优秀的程序员,十分优秀!