3

私は、それぞれが異なるレベルで異なる言語を話すことができるユーザーの次のデータベースを持っています。

id      langs
12      EN-21
36      EN-2,RU-3
41      EN-9
57      DE-35,EN-28
60      DE-9,RU-14

レベルに関係なく、すべての言語の出現回数をカウントする MySQL クエリを作成したいと考えています。目的のタブは次のようになります。

lang    count
EN      4
DE      2
RU      2

私はすでにこれのさまざまな組み合わせを試しましたが、完璧には程遠いです.

SELECT 
    DISTINCT SUBSTRING_INDEX(langs, '-', 1) AS lang, 
--  COUNT(langs) as count
--  SUM(
--      (SELECT DISTINCT SUBSTRING_INDEX(langs, '-', 1) 
--      FROM people
--      WHERE langs != '')
--  )
FROM people
WHERE langs != ''
--  GROUP BY lang
ORDER BY lang
4

2 に答える 2

2

セット内の言語の数に上限がある場合は、最初の要素、2 番目の要素、3 番目の要素などをすべて取り出して、結合することができます。言語セットから最初または 2 番目の要素を取り出して結合する例を次に示します。

select distinct substring_index(langs, '-', 1) as lang
from people where langs != ''
union
select distinct SUBSTRING_INDEX(SUBSTRING_INDEX(langs, '-', 2), ',', -1)
from people where LENGTH(langs) - LENGTH(REPLACE(langs,',','')) + 1 > 1

デモ: http://www.sqlfiddle.com/#!2/b86f2/1


people.langs like '%EN%'そこから、言語のリストと人のリストを組み合わせて、たとえば次のように比較して、一致した数を数えます。

select
  lang,
  count(case when people.langs like concat('%',langs.lang,'%') then 1 end) as count
from people,
  (
    select distinct substring_index(langs, '-', 1) as lang
    from people where langs != ''
    union
    select distinct SUBSTRING_INDEX(SUBSTRING_INDEX(langs, '-', 2), ',', -1)
    from people where LENGTH(langs) - LENGTH(REPLACE(langs,',','')) + 1 > 1
  ) langs
group by langs.lang
order by langs.lang

出力例:

LANG    COUNT
====    ====
DE      2
EN      4
RU      2

デモ: http://www.sqlfiddle.com/#!2/b86f2/5

于 2012-05-24T14:48:26.600 に答える
0
SELECT SUBSTRING_INDEX(langs, '-', 1) AS lang, count(1) as count_lang
FROM people
WHERE langs!=''
GROUP BY lang
ORDER BY lang

これを試して、何が得られるか教えてください。

于 2012-05-24T14:31:06.527 に答える