>

테이블 사용자와 이미지 및 제품과 같은 다른 테이블이 있습니다

테이블 사용자 :

user_id   user_name
1   andrew
2   lutz
3   sophie
4   michael
5   peter
6   oscor
7   anton
8   billy
9   henry
10  jon

테이블 이미지 :

user_id   img_type  img_url
  1 0 url1
  1 1 url4
  2 0 url5
  7 0 url7
  8 0 url8
  9 1 url9

테이블 제품

user_id   prod_id
  1   5
  1   55
  2   555
  8   5555
  9   5
  9   55

이 종류의 SELECT를 사용합니다 :

SELECT * FROM 
(SELECT user.user_id,user.user_name, img.img_type, prod.prod_id FROM
    users 
    LEFT JOIN images img ON img.user_id = users.user_id
    LEFT JOIN products prod ON prod.user_id = users.user_id
    WHERE user.user_id <= 5) AS users
    ORDER BY user.user_id ASC

결과는 다음과 같아야합니다. 성능 향상으로 인해 ORDER BY와 내부 선택을 사용합니다. 내부 또는 외부 선택 내에 LIMIT 5를 넣으면 작동하지 않습니다. MySQL은 결과를 5로 제한하지 않습니다. 그러나 LIMIT 5 (페이지 매김)가 필요한 경우 고유 user_id 결과를 찾았 으며이 경우 9로 이어질 것입니다. if-statement를 사용하여 찾은 user_id로 배열을 푸시하고 배열이 5 개의 UID로 구성 될 때 선택을 중단/종료 할 수 있습니까? 아니면 어떻게 든 선택을 수정할 수 있습니까?

user_id user_name img_type prod_id
1 andrew  0   5
1 andrew  1   5
1 andrew  0   55
1 andrew  1   55
2 lutz  0   5
2 lutz  0   55
3 sophie null null
4 michael null null
5 peter null null
results: 9


  • 답변 # 1

    LIMIT 5  그리고 user_id <= 5  반드시 동일한 결과를 제공하지는 않습니다. 한 가지 이유 : JOINs 이후에 여러 행이 있습니다. ) user_id = 1 . 지정된 '사용자'에 대해 여러 이미지 및/또는 여러 제품이있을 수 있기 때문입니다.

    먼저 원하는 것을 결정하십시오.

    LIMIT   ORDER BY 없이  임의의 행 집합을 제공합니다. (예, 다소 예측 가능하지만이에 의존해서는 안됩니다).

    ORDER BY + LIMIT  보통은 잠재적으로 관련된 모든 행을 수집하고 정렬 한 다음 "제한"을 수행하는 것을 의미합니다. 이 부진과 관련하여때로는방법이 있습니다.

    LEFT   NULLs 로 연결  당신은 얻었다;그걸 원 했니?

    페이지 당 5 개의 항목을 표시하지만 사용자 1에게는 6 개의 이미지가있는 경우 페이지 매김을 어떻게 하시겠습니까? 솔루션에 대한 도움을 받으려면이 엣지 사례를 고려해야합니다. 어쩌면 5를 초과하더라도 사용자 1의전체를 원하십니까? 아마도 당신은 '1'의 중간에 침입하고 싶을 것입니다. 하지만 다음 페이지에서 어디로 가야할지 알 수있는 명확한 방법이 필요합니다.

    아마도 실행 가능한 솔루션은 중첩 된 SELECTs 를 사용하지 않을 것입니다 . 알다시피 "오류"로 이어집니다. 다음과 같이 생각하십시오. 먼저 모든 페이지에 표시해야하는 모든 행을 찾으십시오.그런 다음현재 페이지에 대해 5를 새깁니다.

    여기에 페이지 매김에 대한 몇 가지 생각이 있습니다 : http://mysql.rjweb.org/doc.php/pagination

  • 이전 excel - 차트 이동
  • 다음 php - 공통 값이있는 경우 배열 내부의 요소 그룹화