2012-05-24 2 views
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 
+0

당신이 – triclosan

+0

언어 고정 된 값의 수입니다 people''테이블을 재구성해야합니까? 나는 여기에서 단지 3을 볼 것입니다. – triclosan

+2

EN-32, EN-45로 다른 행이 있다면 EN을 5 또는 6으로 계산합니까? –

답변

0
SELECT SUBSTRING_INDEX(langs, '-', 1) AS lang, count(1) as count_lang 
FROM people 
WHERE langs!='' 
GROUP BY lang 
ORDER BY lang 

이 시도하고 나에게 당신이 무엇을 얻을 알려 주시기 바랍니다.

+1

실제로 시도해 볼 수 있습니다 : http://www.sqlfiddle.com/#!2/8aae3/3. 문제는 계산할 쿼리가 아니라고 생각합니다. 'RU'는 2 단계 이하에서만 출현하기 때문에 'RU'가 누락 된 것입니다. – mellamokb

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 거기에서


, 그것은 목록 언어 목록을 결합의 문제입니다

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 

샘플 출력 : 사람과 예를 들어 people.langs like '%EN%'을 비교하여, 일치의 수를 세는

012 3,516,
LANG COUNT 
==== ==== 
DE  2 
EN  4 
RU  2 

데모 : http://www.sqlfiddle.com/#!2/b86f2/5

+0

위대한 의견이지만 사용자의 언어 수는 이론적으로 무제한입니다. 글쎄, 필자는 PHP를 사용하여 결과 테이블을 작성하는 독창적 인 계획을 고수해야한다고 생각합니다. MySQL이 PHP에서 explode()와 같은 것을 가지고 있지 않다는 것은 수치스러운 일입니다. – meridius

+0

예, MySQL (및 기타 데이터베이스 엔진)은 일반적으로 문자열 처리시 강력하지 않습니다. 최선의 방법은 PHP로 처리하는 것입니다. – mellamokb

관련 문제