结合三个mysql语句

时间:2011-11-10 12:44:38

标签: php mysql

我正在尝试简化一些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=...

给定一个创建者,它获取所有pageid,然后转到第二个表并获取所有这些pageid的urlid然后获取所有这些urlid的链接。我现在正在使用while循环,但怀疑有一种方法可以将它们全部合并到一起。

有什么想法吗?

4 个答案:

答案 0 :(得分: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

应该做我认为的伎俩。如果您只想要唯一的网址,请使用以下网址:

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

<强>图片的标题说明

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

必须扫描整个page表并为每一行调用DATE()函数。您有两种选择可以加快速度:

createdate更改为DATE(来自DATETIMETIMESTAMP,现在更改)并使用:

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

或保持原样并使用:

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

表和列名称更好,没有前缀或后缀,如the。是不是更清洁,更清晰(即使没有别名)?

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

答案 1 :(得分: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的起点

答案 2 :(得分:0)

  

从theurl中选择链接where(从themix中选择urlid)(选择   来自WHERE DATE(createdate)='2011-11-09'ORDED BY页面的pageid   创建了DESC))

OR

  

从theurl中选择链接为tu,themix为tm,页面为tp   tu.id = tm.urlid和tm.pageid = tp.id和DATE(createdate)='2011-11-09'   订购   创建了DESC

任何方式都会给出结果。

答案 3 :(得分:0)

您可以将3个查询嵌套为1并使用IN表达式搜索多个ID。