2015-01-15 2 views
0

assets_tbl (A)에서 모든 레코드를 선택해야합니다. author = "[email protected]" 또는 authorized_viewers 나는 이것이 내가 필요에 가까운 생각 "[email protected]"3 개의 테이블에서 MySQL 다중 조인

을 포함하지만이 같은 레코드의 여러 행을 반환하는 경우 assets_tbl에서 asset_id에 연결되어 내가 (lightbox_name을) 어떤 일러스트가 필요 이러한 기록에 포함 : 여기

SELECT 
    A.*, 
    C.lightbox_name, 
    C.author, 
    C.authorized_viewers 
FROM 
    media_tbl A 
    LEFT JOIN lightbox_assets_tbl B ON A.asset_id = B.asset_id 
    LEFT JOIN lightboxes_tbl C 
    ON B.lightbox_id = C.id 
    AND C.author = "[email protected]" 
    LEFT JOIN lightboxes_tbl D ON D.authorized_viewers LIKE "[email protected]" 
ORDER BY A.id DESC 

이 테이블은 다음과 같습니다 여기
lightboxes_tbl 
+-----+----------------+---------------+---------------------+ 
|id |lightbox_name |author   |authoried_viewers | 
+-----+----------------+---------------+---------------------+ 
|100 | aircraft-types |[email protected] |[email protected],[email protected] | 
|101 | maintenance |[email protected] |[email protected]   | 
|102 | ramp   |[email protected] |[email protected]   | 
+-----+----------------+---------------+---------------------+ 



lightbox_assets_tbl 
+-----+-------------+-------------+---------------+----------+ 
|id |lightbox_id |asset_name |asset_path  | asset_id | 
+-----+-------------+-------------+---------------+----------+ 
|1 |100   |a321.jpg  |project1/imgs/ | 3700  | 
|2 |100   |b757.jpg  |project1/imgs/ | 3444  | 
|3 |101   |FlyBy.swf |project4/imgs/ | 1444  | 
|4 |102   |Door_757.swf |project5/imgs/ | 3701  | 
+-----+-------------+-------------+---------------+----------+ 


assets_tbl 
+-----+---------------------+-------------------------------------+ 
|asset_id |asset_name   | asset_location    | 
+-----------+---------------------+-------------------------------+ 
|3700  |a321.jpg    |Libraries\Library_Media\Images | 
|200  |757_Taxi.swf   |Libraries\Library_Media\Images | 
|3444  |b757.jpg    |Libraries\Library_Media\Images | 
|1444  |FlyBy.swf   |Libraries\Library_Media\Images | 
|3701  |Door_757.swf   |Libraries\Library_Media\Images | 
+----------+---------------------+--------------------------------+ 

이 기대된다 쿼리의 에드 결과 :

+-----------+---------------------+-------------------------------+------------------+-------------+------------------------+ 
|asset_id |asset_name   | asset_location    |lightbox_name  | author  | authorized_viewers  | 
+-----------+---------------------+-------------------------------+------------------+-------------+------------------------+ 
|3700  |a321.jpg    |Libraries\Library_Media\Images |aircraft-types |[email protected] |[email protected],[email protected] | 
+-----------+---------------------+-------------------------------+------------------+-------------+------------------------+ 
|200  |757_Taxi.swf   |Libraries\Library_Media\Images |NULL    |NULL   |NULL     | 
+-----------+---------------------+-------------------------------+------------------+-------------+------------------------+ 
|3444  |b757.jpg    |Libraries\Library_Media\Images |aircraft-types |[email protected] |[email protected],[email protected] | 
+-----------+---------------------+-------------------------------+------------------+-------------+------------------------+ 
|1444  |FlyBy.swf   |Libraries\Library_Media\Images |NULL    |NULL   |NULL     | 
+-----------+---------------------+-------------------------------+------------------+-------------+------------------------+ 
|3701  |Door_757.swf   |Libraries\Library_Media\Images |ramp    |[email protected]|[email protected]   | 
+----------+---------------------+--------------------------------+------------------+-------------+------------------------+ 

SQL Fiddle

감사합니다!

+0

의 함정을 피하기 - 이 조인의 'ON'조건에는 다른 테이블과 관련이 없으므로 카티 전 곱이됩니다. 그건'lightbox_assets_tbl.lightbox_id'에 합류해야합니다, 안돼요? –

+1

적절한 DDL (및/또는 sqlfiddle)을 사용하면 upvote가 생길 수 있습니다. – Strawberry

답변

2

두 개가 lightboxes_tbl 테이블에 조인해야하는 이유가 궁금합니다. 해당 테이블에 대한 두 번째 참조 (별칭 D)가 필요하지 않은 것 같습니다. OR을 사용할 수있는 것 같습니다. 데모로

, 당신의 쿼리의 조건 복제 :

LEFT JOIN lightboxes_tbl C 
     ON B.lightbox_id = C.id 
     AND (C.author = '[email protected]' 
      OR C.authorized_viewers = '[email protected]' 
     ) 

하지만를 authorized_user는 쉼표로 구분 된 목록을 포함 주어진 (ACCKKK!), 나는 당신이 정말로에 정확히 일치하는보고 싶지 의심 쉼표로 구분 된 목록의 항목 현재 가지고있는 LIKE 비교는 동등 비교와 같습니다 (authorized_viewers 열 전체 내용). 문자의 일부로 값을 검색하기 위해 '%' 와일드 카드 문자를 추가 할 수 있습니다 ...

하지만이 방법은 또한 예를 들어. [email protected], 정말 원하지 않을 수도 있습니다. 저장 쉼표로 구분 한 목록

LEFT JOIN lightboxes_tbl C 
     ON B.lightbox_id = C.id 
     AND (C.author = '[email protected]' 
      OR FIND_IN_SET('[email protected]',C.authorized_viewers) 
     ) 

당신은 쉼표로 구분 된 목록 내에서 정확히 일치를 찾기 위해 FIND_IN_SET 기능을 사용할 수는 ...는 SQL 안티 패턴이다. 나는 빌 Karwin의 책을 추천 : SQL 안티 패턴으로 인해 D``에서`LEFT JOIN`에 데이터베이스 프로그래밍

http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557

은 "기록에 여러 행이"로 보이는