选择distinct与其他行outer / join一起?

时间:2014-08-12 20:13:28

标签: mysql database

我有一张类似于

的表格
╔═════════════════════════════════════╗
║ 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)数据库

3 个答案:

答案 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秒才能运行,我希望它更快)