2010-05-02 2 views
1

나는 SQL 데이터베이스가있다. 이 데이터베이스에는 쿼리 할 테이블이 3 개 있습니다. 첫 번째 테이블의 모든 item라는 항목 정보와 다른 두 개의 테이블이있다 userComment라고 투표 및 의견에 대한 데이터 및 전화 투표에 대한 세 번째 userItemsql 문의 문항. 한 번에 3 개의 테이블을 쿼리해야합니다!

I 현재 최신 인기를 얻기 위해이 SQL 쿼리를 사용하는 기능을 가지고 (모두 투표 및 의견의 관점에서) 그러나

I가 단독으로 투표하거나 의견으로이를 변경하는 방법을 알고
$sql = "SELECT itemID, COUNT(*) AS cnt 
FROM (
     SELECT `itemID` 
     FROM `userItem` 
     WHERE FROM_UNIXTIME(`time`) >= NOW() - INTERVAL 1 DAY 
     UNION ALL 
     SELECT `itemID` 
     FROM `userComment` 
     WHERE FROM_UNIXTIME(`time`) >= NOW() - INTERVAL 1 DAY AND `itemID` > 0 
     ) q 
GROUP BY 
     `itemID` 
ORDER BY 
     cnt DESC"; 

....

- 나는 단지를 반환하는 데이터베이스를 조회 할 필요가 0에만 특정 조건이있는 항목의 itemID테이블이 있습니다 WHERE categoryID = 'xx' AND typeID = 'xx'

만약 SQL 닌자가 나를 도울 수 있다면? 위 쿼리의 결과를 먼저 반환해야하고 배열의 각각에 대해 결과를 가져와야하고 item 테이블을 각각 확인하고 새로운 배열을 작성하기위한 조건에 맞는지 확인하십시오. 그렇지 않으면 잔인합니까?

감사합니다, 스테판

당신의 DB가 설치하거나 정확히 어떻게 그것은 내게 분명하지 않다

답변

0

이러한 속성 중 일부입니다하지만 뭔가처럼 될 수 여기서 내가 포함하는 경향 것

$sql = "SELECT q.itemID, COUNT(*) AS cnt 
FROM (
     SELECT `itemID` 
     FROM `userItem` 
     WHERE FROM_UNIXTIME(`time`) >= NOW() - INTERVAL 1 DAY 
     UNION ALL 
     SELECT `itemID` 
     FROM `userComment` 
     WHERE FROM_UNIXTIME(`time`) >= NOW() - INTERVAL 1 DAY AND `itemID` > 0 
     ) q inner join item i on q.itemID = i.itemID 
WHERE i.categoryID = 'xx' AND i.typeID = 'xx' 
GROUP BY 
     q.`itemID` 
ORDER BY 
     cnt DESC"; 
+0

않아요이 제대로 동작 : 따라서, 내가 좋아하는 뭔가를 (이것은 우리가 item 테이블이 다른 사람에게 어떻게 관련되는지 이야기하지 않기 때문에 추측입니다) 할 것인가? 당신이 확신하지 못했던 어떤 추가 정보가 필요합니까? categoryID 및 itemID와 같은 속성은 모든 항목이 실제로 저장되는 'item' 테이블에 있습니다. –

+0

내부 조인은 투표 또는 의견이있는 항목에 대해서만 필터 역할을합니다. 왼쪽 결합으로 변경하십시오 - 도움이됩니까? –

+0

반환 : SQL 구문에 오류가 있습니다. 'q.itemID = i.itemID WHERE i.categoryID ='1 'AND i.typeID ='1 'GROUP BY'라인 10에서 사용하기 위해 올바른 구문을 보려면 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. FROM_UNIXTIME ('time')> = NOW() - INTERVAL 1 일 UNION ALL SELECT'itemID' FROM'userComment' WHERE FROM_UNIXTIME ('time() ')> = NOW() - INTERVAL 1 DAY AND'itemID'> 0) q 왼쪽 항목 조인 i q.itemID = i.itemID WHERE i.categoryID = '1'AND i.typeID = '1'GROUP BY q. 'itemID' ORDER BY cnt DESC –

0

각 쿼리의 필터 나는 검증 할 필요가있을 것이다. 그러나 Group By에서 분석되는 행 수가 적어 질수록 성능이 향상 될 것이라고 생각한다.

$sql = "Select itemID, Count(*) AS cnt 
From (
     Select ui.`itemID` 
     From `userItem` ui 
      Join `item` i 
       On i.itemid = ui.itemid 
     Where From_UnixTime(`time`) >= Now() - Interval 1 Day 
      And i.categoryID = 'xx' 
      And i.typeid = 'xx' 
     Union All 
     Select uc.`itemID` 
     From `userComment` uc 
      Join `item` i 
       On i.itemid= uc.itemid 
     Where From_UnixTime(`time`) >= Now() - Interval 1 Day 
      And uc.itemID > 0 
      And i.categoryID = 'xx' 
      And i.typeid = 'xx' 
     ) q 
Group By `itemID` 
Order By cnt Desc"; 
+0

이 응답, 어떤 아이디어를 얻는가? 필드 목록에서 'itemID'컬럼이 모호합니다 - SELECT itemID, Count (*) AS cnt FROM (SELECT 'itemID' FROM'userItem' ui JOIN'item' i on i.itemid = ui.itemid WHERE From_UnixTime ('time') > = Now() - Interval 7 Day 그리고 i.categoryID = '인기있는'UNION ALL SELECT'itemID' FROM'userComment' uc'item' Join i i.itemid = uc.itemid 여기서 From_UnixTime ('time')> = 지금() - 간격 7 일 그리고 uc.itemID> 0 그리고 i.categoryID = '인기있는') q 'itemID'에 의한 분류 cnt에 의한 순서 Desc –

+0

@Stefan - 당신은 각각의'itemid'에 별칭을 붙이면됩니다. 내부 select 절. 설명하기 위해 내 게시물을 업데이트했습니다. – Thomas

관련 문제