我有一张类似于
的表格╔═════════════════════════════════════╗
║ id type report_id state ║
╠═════════════════════════════════════╣
║ 1 dc 122 pending ║
║ 2 dc 123 pending ║
║ 3 dc 123 approved ║
║ 4 dc 123 pending ║
║ 5 dc 123 approved ║
║ 6 bb 123 pending ║
║ 7 dc 123 pending ║
║ 8 dc 124 pending ║
║ 9 dc 125 pending ║
╚═════════════════════════════════════╝
我正在尝试按状态挂起的类型获取最后一个report_id 所以我想要的结果是
122 (id 1 -- dc)
123 (id 6 -- bb)
123 (id 7 -- dc)
124 (id 8 -- dc)
125 (id 9 -- dc)
现在我正在获取所有内容,然后在阵列上运行3个循环......我知道有一种方法可以join
或执行outer
查询来获取它而不需要循环,任何输入我会如何说出来?
我在一个测试数据库上运行了一个查询(15条记录),它在那里工作,但挂在实时数据库上(40k记录)
SELECT report_id, type, state
FROM histories
WHERE id IN (
SELECT MAX(id) FROM histories
GROUP BY report_id
)
AND state <> 'approved'
为此,子查询执行正常并给我正确的结果,如果我提取子查询,主查询将给我结果,但组合它们并挂起... 在具有有限数据集的本地计算机上测试ta SQL(非MySQL)数据库
答案 0 :(得分:1)
我想你只想要一个带有过滤器的group by
:
select report_id, type, max(id)
from table t
where state = 'pending'
group by report_id, type;
答案 1 :(得分:0)
像
这样的东西SELECT report_id, MAX(id), type
FROM table_name
WHERE state = 'pending'
GROUP BY report_id, type
ORDER BY report_id
其中table_name是您的表名。在你的问题中很难说出你想要的结果。
答案 2 :(得分:0)
我做的是这个
获取子查询并运行它
SELECT MAX(id) FROM histories
GROUP BY report_id
... store as $id_array
然后获取结果并将其存储为CSV
$id_csv = implode(', ' $id_array);
然后运行我的主查询
SELECT report_id, type, state
FROM histories
WHERE id IN ($id_csv)
AND state <> 'approved'
不确定为什么它会分开它,但它完成了工作(查询需要大约3秒才能运行,我希望它更快)