2011-12-27 5 views
0

더 나은 방법이 있다고 생각합니다. 나는 주로 내가하고있는 일이 옳은지, 아니면 훨씬 좋은 길을 찾고 있는지 물어 보는 중이다.하나의 항목과 관련된 여러 항목 선택

이 테이블을 준수하십시오

Users 
id | name 
---+--------- 
1 | Andrew 
2 | Greg 

Images 
id | userid | url 
---+--------+------- 
1 | 1 | img/foo.jpg 
2 | 2 | img/bar.jpg 
3 | 2 | img/baz.jpg 
4 | 1 | img/qux.jpg 

을 사용자 테이블 이미지를 참조하는 하나의 외래 키를 가지고 있다면, 각 사용자는 하나의 이미지에 관련 지을 수 있습니다. 그러나 각 사용자가 이미지 수에 관계되도록 허용하여 대신 이미지에 Users 외래 키를 넣을 수 있습니다.

사용자가 다른 테이블에 저장된 데이터에 대해 하나의 외래 키를 가지고있는 경우 JOIN을 사용하는 방법을 알고 있습니다. 그러나이 경우 관심이있는 사용자와 관련된 여러 외래 키가있는 테이블이 있습니다. SELECT 쿼리를 구성하여 모든 사용자와 관련된 모든 이미지를 검색하는 방법은 무엇입니까? 하나의 SELECT 쿼리에서 사용자와 관련된 데이터 (사용자 유형, 전화 번호, 어쩌면이 작업을 수행하는 방법을 알고 있습니다)?

아니면 더 좋은 방법이 있습니까?

편집 1 : 예를 들어

, 당신은 ID를 가진 사용자를 선택하면 = 1 다음은 사용자의 첫 번째 행 및 이미지의 처음과 마지막 행 (해당 행은 사용자 ID = 1을 가지고 있기 때문에)을 반환합니다.

+0

원하는 결과는 어떻게 생겼습니까? 몇 가지 예를들 수 있습니까? – helle

+0

업데이트 된 게시물보기 –

+0

결과 테이블 (usr 1의 경우)에 두 개의 행이 있습니까? – helle

답변

2

당신이 할 수있는 두 그룹 모두 사용자 당 동일 (사용자) 데이터를 여러 행을 원하고 하나 개의 컬럼에있는 모든 URL을 수집하기 위해 GROUP_CONCAT() 기능을 사용하지 않는 경우 :

SELECT u.* 
    , GROUP_CONCAT(i.URL) 
FROM users u 
    LEFT JOIN Images i 
    ON u.ID = i.userID 
WHERE u.ID = 1 
GROUP BY u.ID 

또는 2를 사용 검색어 :

SELECT u.* 
FROM users u 
WHERE u.ID = 1 

SELECT i.URL 
FROM Images i 
WHERE i.userID = 1 
+0

디자인 적으로, A) CSV 반환, B) 두 개의 개별 쿼리 수행, 또는 C) mysql db 자체에 CSV 저장 제안 하시겠습니까? 나중에 이미지를 추가/제거해야 할 수도 있다고 가정하면 ... 내 스키마와 사용자의 대답을 사용하여이 작업을 수행 할 수 있다는 것을 알고 있지만, 내가 이렇게 묻는 것은 좋은 스타일/디자인으로 간주 될 것입니다. –

+0

귀하의 스키마는 정상입니다. 나는 A를 사용한다는 것은 SQL 엔진이 웹 서버에서 다시 분리 할 URL을 연결해야한다는 것을 의미합니다. C를 사용하면 확실한 번호를 지정할 수 있습니다. http://stackoverflow.com/questions/3653462/is-storing-a-comma-separated-list-in-a-database-column-really-that-bad –

+0

대단히 감사합니다. ! –

1

이렇게 ... 1-1 또는 1-M 인 경우 조인은 동일합니다. 차이가 발생하는 곳은 값이 다른 곳에 존재하지 않거나 일치하는 것이 발견되면 둘 다 모두를 원할 때입니다. SQL을 설명 내 즐겨 찾는 사이트 중 하나는 논리가 coding horror

Select U.Name, I.URL 
FROM users U 
INNER JOIN Images I ON U.ID = I.userID 
Where U.ID = 1 

반환 조인

U.Name I.URL 
Andrew img/foo.jpg 
Andrew img/Qux.jpg 

EDIT 그래서 당신이 후에있는 것은

U.Name I.URL 
Andrew img/foo.jpg 
     img/Qux.jpg 

또는 B입니다 ?

U.Name I.URL 
Andrew img/foo.jp, img/Qux.jpg 
+1

하지만 Andrew와 관련된 이미지가 100 개이면 "Andrew"가 백 번 표시됩니다. 그저 한 번만 필요하기 때문에 이것은 매우 낭비적인 것 같습니다. 모든 이미지 URL과 이름을 한 번만 가져 오는 방법이 있습니까? 내 스키마를 수정해야 할 필요가 있습니까? 바라건대 단 하나의 쿼리 만? :) –

+0

아니요, 모든 URL을 하나의 문자열로 결합하지 않고 (예 :쉼표로 구분 (@ ypercube의 대답 참조) –

+0

@arasmussen IMO 낭비가 아닙니다. 이미 Andrew를 알고 있다면 1에서 검색한다는 것을 알고 나면, 단순히 I.URL 필드 만 반환하면됩니다. 이 시점에서 Andrew를 알지 못했다면 Andrew의 각 인스턴스에 대해 약간의 오버 헤드가 있습니다. 하지만 그것은 단순히 논리가 작동하는 방식입니다. 또는 이전에 언급 한 바와 같이, ypercube의 답변을 사용하여 나머지를 group_Concat으로 만들었지 만, 당신은 그들을 분리해야합니다. 간단히 말하면 데이터는 정규화 된 방식으로 저장되고 쿼리는 반환 된 데이터에 혼란을 피하기 위해 비정규 화 된 방식으로 데이터를 반환합니다. – xQbert

관련 문제