[SQL] MySQL의 INNER는 두 번째 테이블에서 하나의 행을 선택 가입
SQLMySQL의 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.당신은 사용자 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.
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.
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.
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.귀하의 요청에 두 가지 문제가 있습니다 :
귀하의 요청에 두 가지 문제가 있습니다 :
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.
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.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.@ 존 우의 대답은 나를 비슷한 문제를 해결할 수있었습니다. 나는뿐만 아니라 올바른 순서를 설정하여 그의 대답에 개선했습니다. 이것은 나를 위해 일했다 :
@ 존 우의 대답은 나를 비슷한 문제를 해결할 수있었습니다. 나는뿐만 아니라 올바른 순서를 설정하여 그의 대답에 개선했습니다. 이것은 나를 위해 일했다 :
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.당신이 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.이 시도 할 수 있습니다 :
이 시도 할 수 있습니다 :
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
from https://stackoverflow.com/questions/12526194/mysql-inner-join-select-only-one-row-from-second-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] ANSI SQL 설명서 (0) | 2020.06.01 |
---|---|
[SQL] 구글 스프레드 시트 "= QUERY는"() 해당 기능을 결합? (0) | 2020.06.01 |
[SQL] 열이 수정 SQL 업데이트 트리거 만 (0) | 2020.06.01 |
[SQL] SQL 키워드에 대한 대문자를 사용하는 좋은 이유가 있나요? [닫은] (0) | 2020.06.01 |
[SQL] 엔티티 프레임 워크에서 예외가 발생합니다 - 잘못된 개체 이름 'dbo.BaseCs' (0) | 2020.06.01 |