2011-11-10 3 views
1

일부 mysql을 단순화하려고합니다. 다음 두 번째 테이블로 이동하고 해당 페이지 id 년대에 대한 모든 URLID 년대이 후 모든 URLID 년대에 대한 링크를 얻을 도착, 세 개의 mysql 문 결합하기

SELECT pageid FROM thepage WHERE DATE(createdate)='2011-11-09' ORDER BY createdate DESC 

SELECT urlid FROM themix WHERE pageid=... 

SELECT link FROM theurl WHERE urlid=... 

가 createdate을 감안할 때

, 그것은 모든 페이지 id의의를 가져옵니다 나는 세 가지 선택하여 세 개의 테이블이있다. 지금 while 루프를 사용하고 있지만 모두를 하나로 결합하는 방법이 있다고 의심됩니다.

아이디어가 있으십니까?

+2

LEFT JOIN을 사용해 보았습니까? – tonoslfx

+1

맞아, 당신은 이미 .. 당신은 테이블에 가입하고 싶다 – mishu

+0

나에게 간단한 SQL JOIN 작업처럼 보입니다. – GordonM

답변

5
SELECT p.pageid 
    , u.link 
FROM thepage p INNER JOIN themix m 
    ON p.pageid = m.pageid 
INNER JOIN theurl u 
    ON m.urlid = u.urlid 
WHERE DATE(p.createdate) = '2011-11-09' 
ORDER BY p.createdate DESC 

트릭을해야한다고 생각합니다. 당신 만의 고유 URL을하려면이를 사용

SELECT u.link 
FROM thepage p 
    INNER JOIN themix m 
    ON p.pageid = m.pageid 
    INNER JOIN theurl u 
    ON m.urlid = u.urlid 
WHERE DATE(p.createdate) = '2011-11-09' 
GROUP BY m.urlid 
ORDER BY MIN(p.createdate) DESC 

Sidenotes

WHERE DATE(p.createdate) = '2011-11-09' 

을 전체 page 테이블을 스캔하고 모든 행에 대한 DATE() 함수를 호출해야합니다. 당신이 할 수있는 두 가지 옵션이 있습니다 그것을 빨리 :

변경 createdateDATE 및 사용 (DATETIME 또는 TIMESTAMP, 지금이라고에서) :

WHERE p.createdate = '2011-11-09' 

또는 그것이 사용으로 유지 :

WHERE p.createdate >= '2011-11-09' 
    AND p.createdate < '2011-11-10' 

테이블 및 열 이름은 당신이 가지고있는 the 같은 접두사 나 접미사없이 더 낫다. 더 깨끗하고 명확하지 않습니까 (별칭이 없더라도)? theurl에서

SELECT url.link 
FROM page 
    INNER JOIN mix 
    ON page.pageid = mix.pageid 
    INNER JOIN url 
    ON mix.urlid = url.urlid 
WHERE DATE(page.createdate) = '2011-11-09' 
ORDER BY page.createdate DESC 
+0

작동하는 것 같습니다! 감사합니다. 정신적 인 과정을 단순화하기 위해 사용하는 특별한 트릭이 있습니까? 어떤 팁? – David19801

+0

정말로, 내가 한 일을 보아라. 그리고 어느 시점에서 당신은 단지 아이디어를 얻는다. – Manuel

+0

문제 - 반복되는 urlid를 포함하여 모든 것을 얻고 있습니다 ... – David19801

0

SELECT 링크 ((thepage에서 페이지 id를 선택 themix에서 선택 URLID 여기서 WHERE DATE (createdate) = createdate의 DESC BY '2011-11-09'ORDER))

OR

theurl에서

SELECT 링크 TU로서 themix TP tu.id = tm.urlid 및 tm.pageid = tp.id DATE 및 (c 같은 TM, 등 thepage createdate의 DESC

이 결과를 줄 것이다 어떤 방법 BY reatedate) = '2011-11-09' ORDER.

+0

그는 어디에서 사용할 수 있습니까? 아니면 IN을 사용해야합니까? – Bytemain

+0

첫 번째 오류 : 하위 쿼리가 두 개 이상의 행을 반환합니다. – David19801

0

3 개의 쿼리를 1로 중첩시키고 IN 식을 사용하여 여러 ID를 검색 할 수 있습니다.

2

귀하는 이미 의견에 대한 귀하의 게시물에 대한 의견을 받았습니다.당신은 정말 조인 SQL의 다양한 유형에 대해 배워야한다

당신이 이런 식으로 달성되어야합니다 :

SELECT 
    theurl.link 
FROM 
    thepage 
LEFT JOIN 
    themix 
ON 
    thepage.pageid = urlid.pageid 
LEFT JOIN 
    theurl 
ON 
    theurl.urlid = themix.urlid 
WHERE 
    DATE(thepage.createdate)='2011-11-09' 
ORDER BY 
    thepage.createdate DESC 

당신은 SQL에 대한 당신의 연구를위한 출발점으로 여기 있어요 답변을 사용해야합니다

관련 문제