>

다른 23 개의 테이블이있는 기본 테이블에 가입하고 싶습니다. 그러나 다른 테이블과 하나를 조인하려면 LEFT JOIN을 사용해야합니다. 내 쿼리 샘플 :

SELECT notif_dest_user.notif_id,
       notif_all.da,
       COALESCE(notif_trick_like.uft_id, notif_trick_comment.uft_id) AS uft_id,
       COALESCE(like_users.un, trickComment_users.un)                AS un,
       COALESCE(like_tricks.tr_n, trickComment_tricks.tr_n)          AS tr_n,
       trickComment_userForTricks.cm_tx,
       COALESCE(trickComment_users.av_ul,like_users.av_ul)                       AS av_ul
FROM notif_dest_user
       LEFT JOIN notif_all ON notif_all.notif_id = notif_dest_user.notif_id
       LEFT JOIN notif_trick_like ON notif_dest_user.notif_id = notif_trick_like.notif_id
       LEFT JOIN user_for_tricks like_userForTricks ON notif_trick_like.uft_id = like_userForTricks.uft_id
       LEFT JOIN tricks like_tricks ON like_userForTricks.tr_id = like_tricks.tr_id
       LEFT JOIN users like_users ON like_userForTricks.u_id = like_users.u_id
       LEFT JOIN notif_trick_comment ON notif_trick_comment.notif_id = notif_dest_user.notif_id
       LEFT JOIN user_for_tricks trickComment_userForTricks
         on trickComment_userForTricks.uft_id = notif_trick_comment.uft_id
       LEFT JOIN users trickComment_users ON trickComment_users.u_id = trickComment_userForTricks.u_id
       LEFT JOIN tricks trickComment_tricks ON trickComment_tricks.tr_id = trickComment_userForTricks.tr_id
where notif_dest_user.dest_u_id = 42
limit 10;

쿼리 결과는 다음과 같습니다 :

+----------+------------+---------+-------------+-------------+-------------+------------------------------------+
| notif_id | da         | uft_id  | un          | tr_n        | cm_tx       | av_ul                              |
+----------+------------+---------+-------------+-------------+-------------+------------------------------------+
|       10 | 1542866579 | 1799477 | NULL        | NULL        | NULL        | NULL                               |
|       11 | 1542866579 | 1799494 | Some result | Some result | Some result | pics/avatars/u2764_1504729707_3092 |
|       12 | 1542866579 | 1799386 | Some result | Some result | Some result |                                    |
|       13 | 1542866579 | 1799477 | NULL        | NULL        | NULL        | NULL                               |
|       14 | 1542866579 | 1799494 | Some result | Some result | Some result | pics/avatars/u2764_1504729707_3092 |
|       15 | 1542866579 | 1799386 | Some result | Some result | Some result |                                    |
|       16 | 1542866579 | 1799477 | NULL        | NULL        | NULL        | NULL                               |
|       17 | 1542866579 | 1799494 | Some result | Some result | Some result | pics/avatars/u2764_1504729707_3092 |
|       18 | 1542866579 | 1799386 | Some result | Some result | Some result |                                    |
|       19 | 1542866579 | 1799477 | NULL        | NULL        | NULL        | NULL                               |
+----------+------------+---------+-------------+-------------+-------------+------------------------------------+

그러나 오른쪽 테이블 (기타 23 테이블)에 존재하지 않는 행 (NULL)을 가져 가고 싶지 않습니다. 즉, 기본 테이블과 다른 테이블 사이에 개별 INNER JOIN 행의 합계를 표시하려고합니다. 다음과 같은 것 :

+----------+------------+---------+-------------+-------------+-------------+-------------------------------------+
| notif_id | da         | uft_id  | un          | tr_n        | cm_tx       | av_ul                               |
+----------+------------+---------+-------------+-------------+-------------+-------------------------------------+
|    10000 | 1542866579 | 1799408 | some result | some result | some result | pics/avatars/u63067_1517939524_6583 |
|    10001 | 1542866579 | 1799554 | some result | some result | some result | pics/avatars/u87332_1521754761_3673 |
|    10002 | 1542866579 | 1799422 | some result | some result | some result | pics/avatars/u63067_1517939524_6583 |
|    10003 | 1542866579 | 1799408 | some result | some result | some result | pics/avatars/u63067_1517939524_6583 |
|    10004 | 1542866579 | 1799554 | some result | some result | some result | pics/avatars/u87332_1521754761_3673 |
|    10005 | 1542866579 | 1799422 | some result | some result | some result | pics/avatars/u63067_1517939524_6583 |
|    10006 | 1542866579 | 1799408 | some result | some result | some result | pics/avatars/u63067_1517939524_6583 |
|    10007 | 1542866579 | 1799554 | some result | some result | some result | pics/avatars/u87332_1521754761_3673 |
|    10008 | 1542866579 | 1799422 | some result | some result | some result | pics/avatars/u63067_1517939524_6583 |
|    10009 | 1542866579 | 1799408 | some result | some result | some result | pics/avatars/u63067_1517939524_6583 |
+----------+------------+---------+-------------+-------------+-------------+-------------------------------------+

  • 답변 # 1

    두 가지 옵션 :

    1) 오른쪽 표에서 일치하지 않는 행을 필터링하려면 LEFT 를 건너 뛰십시오.  키워드를 사용하고 정규 (내부) 조인을 사용하십시오.

    2) 모든 표현식이 NULL로 평가 된 행을 필터링하려면 다음과 같은 정규 WHERE 절을 사용하십시오.

    SELECT ...
    FROM ...
    WHERE COALESCE(notif_trick_like.uft_id, notif_trick_comment.uft_id) IS NOT NULL
    OR COALESCE(like_users.un, trickComment_users.un) IS NOT NULL
    OR COALESCE(like_tricks.tr_n, trickComment_tricks.tr_n) IS NOT NULL
    OR trickComment_userForTricks.cm_tx IS NOT NULL
    OR COALESCE(trickComment_users.av_ul,like_users.av_ul) IS NOT NULL
    
    

  • 답변 # 2

    NOT NULL 를 피하려는 경우  행, 패턴입니다 :

    SELECT ...
        FROM a
        LEFT JOIN b ON ...
        WHERE b.id IS NULL;
    
    

    여러 LEFT JOINs 로 확장  그리고 여러 테스트 AND'd   WHERE 에서 함께 .

    위즈 와이즈를 피하면서 이미 언급했듯이  행, 변경 NULL   LEFT JOIN 로 .

    (부록 : 키워드 JOIN  그리고 INNER  선택 사항이며 MySQL에서는 무시됩니다.)

    OUTER

  • 이전 sql server - 존재하지 않는보기에서보기 만들기
  • 다음 innodb - frm 파일 및 데이터베이스 페이지와 관련하여 SELECT 쿼리를 보낼 때 DBMS는 정확히 무엇을 수행합니까? (MySQL)