2011-01-24 3 views
1

나는 내가 뭔가 잘못하고 있다고 확신하지만 정확히 무엇을 알아 내지 못하니.MySQL LEFT JOIN RAND() - 이상한 행동? 아니면 내가 뭔가 잘못하고있는거야?

쿼리가 제대로 실행되고 아무 이유없이 aff_affiliatelink 빈을 반환하는 경우가 있습니다. 첫 번째 JOIN에서 RAND()를 제거하면 모든 것이 잘 작동하지만 임의의 제휴가 필요합니다 ... 이 문제를 일으킬 수있는 아이디어가 있습니까?

EDIT : 그냥 눈치 챘습니다. aff_affiliatelink의 game_software는 항상 "2"입니다. 연결되어 있는지는 모르지만 잘못 이해하는 데 유용 할 수 있습니다.

SELECT game_software, 
      aff_affiliatelink 
    FROM games g  
LEFT JOIN (SELECT asoft_affiliateid,asoft_softwareid 
      FROM affiliates_software 
     ORDER BY RAND()) aff_soft ON aff_soft.asoft_softwareid =g.game_software  
LEFT JOIN (SELECT aff_id, 
        aff_affiliatelink, 
        aff_description, 
        aff_bonus, 
        aff_title, 
        aff_image, 
        aff_imagealt, 
        aff_banner, 
        aff_banneralt 
      FROM affiliates 
      WHERE aff_isactive = 1) aff ON aff_id=aff_soft.asoft_affiliateid  
GROUP BY game_id 
ORDER BY game_releasedate DESC 

편집 :

여기 내 쿼리입니다 두 번째 왼쪽을 변경 한 후 작동하지만 그 그것을하는 올바른 방법입니다 확실하지 메신저 보인다, 가입 INNER에 가입 .. .. 누군가 다른 아이디어가 있다면, 괜찮은 대답을 얻을 때까지이 질문을 열어 두겠다고 말하십시오.

답변

0

가입 내부에 가입 할 수 있습니다. 도움을 주셔서 감사합니다.

SELECT game_id,gtype_imagefolder,game_isactive,game_title,game_description,game_image,game_imagealt,game_content,game_alias,game_software,game_flashlink,game_metatitle,game_metakeywords,game_metadescription,game_h1title,game_h1content,game_h2title,game_h2content,aff_affiliatelink,aff_description,aff_bonus,aff_id,aff_title,aff_image,aff_imagealt,aff_banner,aff_banneralt 
FROM games g 
LEFT JOIN (SELECT asoft_affiliateid,asoft_softwareid 
     FROM affiliates_software 
     ORDER BY RAND()) aff_soft 
ON g.game_software=aff_soft.asoft_softwareid 
INNER JOIN (SELECT aff_id,aff_affiliatelink,aff_description,aff_bonus,aff_title,aff_image,aff_imagealt,aff_banner,aff_banneralt 
      FROM affiliates 
      WHERE aff_isactive=1) aff 
ON aff_id=asoft_affiliateid 
LEFT JOIN (SELECT gtype_imagefolder,gtype_id FROM games_type) gt ON game_type=gtype_id 
WHERE game_type=1 

GROUP BY game_id ORDER BY game_releasedate DESC 
1

문제는 나중에 쿼리를 다시 주문하는 것입니다. 임의의 제휴사에서 단일 항목을 얻으려는 경우 ORDER BY RAND() 뒤에 LIMIT 1을 추가해야합니다. 그렇지 않으면 순서는 나중에 외부 순서에 의해 무시 될 것이므로 쿼리가 느려지 게됩니다.

오, 당신이 체크 아웃해야 this blog post에 대한 ORDER BY RAND() ...이 솔루션은 두 번째 왼쪽을 변경하는 것이 었습니다 좀 더 테스트 후

+2

@Rephael : ORDER BY RAND()는 속도에 영향을 미치지 않지만 배치 할 때 이점을주지는 않습니다. –

+0

음, 그렇다고 생각됩니다. 내가 제거하면 매번 같은 제휴사를 얻습니다. 그곳에는 매번 다른 계열사가 있습니다. 내가 필요한 것입니다. – Dementic

1
SELECT game_software, aff_affiliatelink 
FROM (
     SELECT game_software, game_releasedate 
       (
       SELECT asoft_affiliateid 
       FROM affiliates_software afs 
       WHERE afs.afost_softwareid = g.game_software 
       ORDER BY 
         RAND() 
       LIMIT 1 
       ) AS asoft_affiliateid 
     FROM games g 
     ) asd 
LEFT JOIN 
     affiliates a 
ON  a.aff_id = asd.asoft_affiliateid 
     AND a.aff_isactive = 1 
ORDER BY 
     game_releasedate DESC 
+0

안녕하세요 quassnoi, 나는 이것을 시도하고 다시보고 할 것입니다. – Dementic

+0

@Rephael : 이런 종류의 질의를 위해서는 계열사 목록을 '게임'에 쉼표로 구분 된 목록으로 유지하는 것이 좋습니다. 이렇게하면 속도가 빨라집니다. – Quassnoi

+0

글쎄,이 솔루션을 테스트 한 후, 나는 유감스럽게도 똑같이 발생합니다. 코드를 몇 번 실행하면 일부 reaason의 제휴사에 대한 빈 데이터가 반환됩니다. – Dementic