使用一些lastIndexOf选择DISTINCT + COUNT?

时间:2011-09-02 05:00:11

标签: php sql

我在这里要做的是提取字符串的最后一部分。字符串总是以相同的方式结束:thisismy-string。所以我反过来搜索' - '来提取'string'(可以是任何东西)。即:'hello-world'获得'世界'

SELECT DISTINCT REVERSE(SUBSTR(REVERSE(field_name), 1, INSTR(REVERSE(field_name), '-')-1)) AS grp FROM table GROUP BY grp ORDER BY id

哪个工作正常。现在我如何计算次数,SQL在执行DISTINCT函数时发现了相同的“字符串结束”?是否可以在同一个查询中组合它?我正在将此查询用于PHP项目...

1 个答案:

答案 0 :(得分:2)

SELECT
    COUNT(*) AS `occurrences`,
    SUBSTRING_INDEX(`field_name`, '-', -1) AS `last_part`
FROM table
GROUP BY `last_part`

SUBSTRING_INDEX([field or string], [delimiter], -1)将为您提供最后一部分(由于-1),COUNT()尊重分组

编辑:你的标题说的是“lastIndexOf”,我假设你的意思是每个分组的最高id。您可以将MAX(`id`)添加到您选择的字段

SELECT
    COUNT(*) AS `occurrences`,
    SUBSTRING_INDEX(`field_name`, '-', -1) AS `last_part`,
    MAX(`id`) AS `last_index_of`
FROM table
GROUP BY `last_part`

实施例

id  | field_name
------------------------
1   | foo-bar
2   | woo-bar
3   | woo-foo-baz
4   | foo-foo
5   | foo-boo
6   | foo-bar
7   | foo-baz
8   | kung-foo
9   | xyz-xyz
10  | 123-xyz

结果:

occurrences | last_part | last_index_of
----------------------------------------
3           | bar       | 6
2           | baz       | 7
1           | boo       | 5
2           | foo       | 8
2           | xyz       | 10