2012-01-20 4 views
1

많은 스레드가 있지만 작동 할 솔루션을 찾을 수없는 것 같습니다. 다음은 내가 가진 쿼리입니다.mysql 쿼리 - 여러 (5) 열에 중복 된 것을 표시하지 않습니까?

$sql = "SELECT DISTINCT `People`,`People2`,`People3`,`People4`,`People5` 
FROM `album1` 
WHERE `People` != '' ORDER BY `People`"; 

여러 문제가 있습니다. 첫째, 중복이 계속 표시됩니다. 또한 여러 열에 WHERE하는 방법을 알아낼 수 없습니다 ...

테이블은 다음과 같이 보입니다.

People | People2 | People3 | People4 | People5 
--------+----------+---------+---------+-------- 
Alex | Frank |   |   | John  
Alex |   | John | Frank | 

사진을 "태그 지정"하는 데 본질적으로 사용됩니다. 사람의 이름이 5 인 입력 필드에 입력 될 수 있기 때문에 이름이 모든 곳에서 끝납니다.

내가하고있는 모든 작업은 이름을 한 번 표시하려고하는 것입니다. People! = ''은 (는) 빈 셀을 표시하지 않습니다.

아이디어가 있으십니까? 추가 정보가 필요한지 알려주십시오.

+0

앨범 테이블의 주요 필드는 무엇입니까? – Sparky

+0

다음은 스크린 샷입니다. http://cl.ly/2s3h0P1I443n2A0R1V1T/Image%202012-01-20%20at%203.32.53%20PM.png – elzi

+5

위 표의 데이터를 정규화하지 않은 이유가 있습니까? 한 가지 제안은 되풀이되는 "People"열을 자신의 테이블로 이동 한 다음 새로운 People 테이블에서 위의이 테이블 쇼까지 일대 다 관계를 만드는 것입니다. 이렇게하면 쿼리가 쉬워지고 더 이상 행당 "인원수"가 5 명으로 제한되지 않습니다. – user1231231412

답변

4

이 경우 비정규 화해야하므로 People 열만 있습니다. 특이점을 강조하려면 Person으로 전화해야합니다.

그러나 데이터 모델에서 어떤 이유로 든 그렇게 할 수 없다면이 작업을 수행 할 수 있습니다. 가상 단일 Person 열을 만듭니다.

SELECT DISTINCT People as Person, Place, Year, Filename, Orientation 
FROM (
    SELECT People AS People, Place, Year, Filename, Orientation 
    FROM ALBUM1 
    WHERE People IS NOT NULL and People <> '' 
    UNION ALL 
    SELECT People1 AS People, Place, Year, Filename, Orientation 
    FROM ALBUM1 
    WHERE People1 IS NOT NULL and People1 <> '' 
    UNION ALL 
    SELECT People2 AS People, Place, Year, Filename, Orientation 
    FROM ALBUM1 
    WHERE People2 IS NOT NULL and People2 <> '' 
/* etc */ 
)a 
ORDER BY People, Place, Year, Filename, Orientation 
+0

나는 당신이 다음과 같은 의미를 가졌다 고 생각한다 : * "당신은 ** 이것을 ** 정상화해야한다. 그래서 ..."* –

+0

안녕하세요. 여기에 시도 : http://nerdi.net/playground/photag/indextest2.php 결과가 없습니다. 나는 또한 결과가 없으므로 사용하지 않는 것처럼 "사람으로"제거했습니다. 그것은 중복을 보여 계속하고 왜 모르겠어요 ... – elzi

0

첫째, "독특한"은 당신이 3 열을 선택할 때, 그들은 예를 들어, 결과 행에 대해, "A, B, C, 및"A, 조합에서 별개의 것, 전체 결과 행에서 작동 , B "는 별개이지만 또 다른"A, B, C "는 해고 될 것입니다. (예를 들어, 내가 틀렸다면 나에게 맞는) 당신은 앨범에있는 모든 사람들의 목록을 생성하고 싶다고 가정하면 UNION가 마음에 오는 DISTINCT 작업을 만들기 위해 함께 모든 열을 잼 :

select people from album where... 
UNION DISTINCT 
select people2 from album where... 
UNION DISTINCT 
select people3 from album where... 

(당신이 정말로 UNI에서 DISTINCT 명시 할 필요가 없습니다 on-clause, 기본 동작이므로)

이렇게하면 모든 "사람"열이 DISTINCT가 작동 할 수있는 단일 목록에 연결됩니다.

다른 메모 작성자와 답변이 맞습니다. 정상화해야합니다.

이 같은
0

시도 뭔가 (는 빈 열을 제거합니다),하지만, 나는 매우 많은 존 C에 동의,이 ... 해결 부적절한 데이터베이스 설계에 대한입니다

select id,max(people) as People,max(people2) as Pep2, 
      max(people3) as Pep3,max(people4) as Pep4,max(people5) as Pep5 
from 
(
select id,people,'' as People2,'' as People3,'' as People4,'' as People5 
from dbo.album 
where people <> '' 
union 
select id,'',people2,'','','' 
from dbo.album 
where people2 <> '' 
union 
select id,'','',people3,'','' 
from dbo.album 
where people3 <> '' 
union 
select id,'','','',people4,'' 
from dbo.album 
where people4 <> '' 
union 
select id,'','','','',people5 
from dbo.album 
where people5 <> '' 
) xx 
group by id 
0

나는 완전히 다른 접근법을 취할 것입니다 : 너무 어렵거나 복잡한 SQL을 간단한 작업으로 작성하는 경우 - 테이블 구조가 달라야합니다!

내가 올바르게 이해했다면 달성하려는 것은 "누구를 태그 한 사람"이라는 의미입니다. 즉, 항상 첫 번째 열 (사람)이! = NULL이되기를 원합니다. NULL이 아닌 다른 열 (ppl2, ppl3 ...).

맞으면이 테이블의 구조를 "태그 지정자"및 "태그 지정됨"의 두 열만으로 변경합니다. 모든 행은 다른 사람을 태그 한 사람 한 명만을 나타 내기 때문에 다른 모든 열은 필요 없습니다.

이 구현을 사용하면 Mark가 태그 한 모든 사용자 또는 Robert를 태그 한 모든 사용자를 매우 쉽게 선택할 수 있습니다.

희망 하시겠습니까?

관련 문제