복붙노트

[SQL] MySQL의 INNER는 두 번째 테이블에서 하나의 행을 선택 가입

SQL

MySQL의 INNER는 두 번째 테이블에서 하나의 행을 선택 가입

나는 지불 테이블에서 여러 관련 지불을 할 수 있습니다, 지불이 그 어느 각각의 사용자를 들어, 사용자 테이블과 지불 테이블을 가지고있다. 내가 지불이있는 모든 사용자를 선택,하지만 그들의 최신 지불을 선택하고 싶습니다. 나는이 SQL 노력하고있어하지만 난 내가 잘못 뭘하는지 알고 싶어 그래서 전에 중첩 된 SQL 문을 한 번도 안 써봤. 도움을 주셔서 감사합니다

SELECT u.* 
FROM users AS u
    INNER JOIN (
        SELECT p.*
        FROM payments AS p
        ORDER BY date DESC
        LIMIT 1
    )
    ON p.user_id = u.id
WHERE u.package = 1

해결법

  1. ==============================

    1.당신은 사용자 ID 당 최신 날짜를 얻을 수있는 하위 쿼리가 필요합니다.

    당신은 사용자 ID 당 최신 날짜를 얻을 수있는 하위 쿼리가 필요합니다.

    SELECT  a.*, c.*
    FROM users a 
        INNER JOIN payments c
            ON a.id = c.user_ID
        INNER JOIN
        (
            SELECT user_ID, MAX(date) maxDate
            FROM payments
            GROUP BY user_ID
        ) b ON c.user_ID = b.user_ID AND
                c.date = b.maxDate
    WHERE a.package = 1
    
  2. ==============================

    2.

    SELECT u.*, p.*
    FROM users AS u
    INNER JOIN payments AS p ON p.id = (
        SELECT id
        FROM payments AS p2
        WHERE p2.user_id = u.id
        ORDER BY date DESC
        LIMIT 1
    )
    

    이 같은 사용자와 날짜에 일부 지불가 제대로 때 작동하기 때문에이 솔루션은 허용 대답보다 낫다.

  3. ==============================

    3.

    SELECT u.*, p.*, max(p.date)
    FROM payments p
    JOIN users u ON u.id=p.user_id AND u.package = 1
    GROUP BY u.id
    ORDER BY p.date DESC
    

    이 sqlfiddle 체크 아웃

  4. ==============================

    4.

       SELECT u.* 
            FROM users AS u
            INNER JOIN (
                SELECT p.*,
                 @num := if(@id = user_id, @num + 1, 1) as row_number,
                 @id := user_id as tmp
                FROM payments AS p,
                     (SELECT @num := 0) x,
                     (SELECT @id := 0) y
                ORDER BY p.user_id ASC, date DESC)
            ON (p.user_id = u.id) and (p.row_number=1)
            WHERE u.package = 1
    
  5. ==============================

    5.귀하의 요청에 두 가지 문제가 있습니다 :

    귀하의 요청에 두 가지 문제가 있습니다 :

    payments.date에 대한 관계가없는 가정하면, 시도 :

        SELECT u.*, p.* 
        FROM (
            SELECT MAX(p.date) AS date, p.user_id 
            FROM payments AS p
            GROUP BY p.user_id
        ) AS latestP
        INNER JOIN users AS u ON latestP.user_id = u.id
        INNER JOIN payments AS p ON p.user_id = u.id AND p.date = latestP.date
        WHERE u.package = 1
    
  6. ==============================

    6.

    SELECT U.*, V.* FROM users AS U 
    INNER JOIN (SELECT *
    FROM payments
    WHERE id IN (
    SELECT MAX(id)
    FROM payments
    GROUP BY user_id
    )) AS V ON U.id = V.user_id
    

    이것은 작업을 진행하게됩니다

  7. ==============================

    7.Matei 미하이는 간단하고 효율적인 솔루션을 제공하지만, SELECT 부분에서 MAX (날짜)를 넣을 때까지하지 작업이 쿼리가 될 것이다 있도록 :

    Matei 미하이는 간단하고 효율적인 솔루션을 제공하지만, SELECT 부분에서 MAX (날짜)를 넣을 때까지하지 작업이 쿼리가 될 것이다 있도록 :

    SELECT u.*, p.*, max(date)
    FROM payments p
    JOIN users u ON u.id=p.user_id AND u.package = 1
    GROUP BY u.id
    

    그리고 의지에 의해 순서 그룹화에 어떤 차이를 만들지 만에 의해 그룹에서 제공하는 최종 결과를 주문할 수 있습니다. 나는 그것을 시도하고 나를 위해 일했다.

  8. ==============================

    8.@ 존 우의 대답은 나를 비슷한 문제를 해결할 수있었습니다. 나는뿐만 아니라 올바른 순서를 설정하여 그의 대답에 개선했습니다. 이것은 나를 위해 일했다 :

    @ 존 우의 대답은 나를 비슷한 문제를 해결할 수있었습니다. 나는뿐만 아니라 올바른 순서를 설정하여 그의 대답에 개선했습니다. 이것은 나를 위해 일했다 :

    SELECT  a.*, c.*
    FROM users a 
        INNER JOIN payments c
            ON a.id = c.user_ID
        INNER JOIN (
            SELECT user_ID, MAX(date) as maxDate FROM
            (
                SELECT user_ID, date
                FROM payments
                ORDER BY date DESC
            ) d
            GROUP BY user_ID
        ) b ON c.user_ID = b.user_ID AND
               c.date = b.maxDate
    WHERE a.package = 1
    

    나는이 있지만, 얼마나 효율적으로 잘 모르겠어요.

  9. ==============================

    9.당신이 ORDER BY 절에서 여러 COLS 필요하면 내 대답은 직접 @valex 매우 유용한에서 영감을.

    당신이 ORDER BY 절에서 여러 COLS 필요하면 내 대답은 직접 @valex 매우 유용한에서 영감을.

        SELECT u.* 
        FROM users AS u
        INNER JOIN (
            SELECT p.*,
             @num := if(@id = user_id, @num + 1, 1) as row_number,
             @id := user_id as tmp
            FROM (SELECT * FROM payments ORDER BY p.user_id ASC, date DESC) AS p,
                 (SELECT @num := 0) x,
                 (SELECT @id := 0) y
            )
        ON (p.user_id = u.id) and (p.row_number=1)
        WHERE u.package = 1
    
  10. ==============================

    10.이 시도 할 수 있습니다 :

    이 시도 할 수 있습니다 :

    SELECT u.*, p.*
    FROM users AS u LEFT JOIN (
        SELECT *, ROW_NUMBER() OVER(PARTITION BY userid ORDER BY [Date] DESC) AS RowNo
        FROM payments  
    ) AS p ON u.userid = p.userid AND p.RowNo=1
    
  11. from https://stackoverflow.com/questions/12526194/mysql-inner-join-select-only-one-row-from-second-table by cc-by-sa and MIT license