[英]Combining three mysql statements
我正在尝试简化一些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,它将获取所有pageid,然后转到第二个表,并获取这些pageid的所有urlid,然后获取所有这些urlid的链接。 我现在正在使用while循环,但是怀疑有一种方法可以将它们全部合并为一个。
有任何想法吗?
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
旁注
WHERE DATE(p.createdate) = '2011-11-09'
将必须扫描整个page
表并为每一行调用DATE()
函数。 您有两种选择可以使其更快:
将createdate
更改为DATE
(从DATETIME
或TIMESTAMP
更改为现在),然后使用:
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
您已经在帖子评论中收到了一些反馈。 您应该真正了解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的起点
从URL所在位置选择链接(从混合位置选择urlid(从WHERE DATE(createdate)='2011-11-09'ORDER BY createdate DESC的页面选择页面ID))
要么
从theurl作为tu,themix作为tm,页面作为tp进行SELECT链接,其中tu.id = tm.urlid和tm.pageid = tp.id且DATE(createdate)='2011-11-09'ORDER BY createdate DESC
任何方式都会产生结果。
您可以将3个查询嵌套到1个中,并使用IN表达式搜索多个ID。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.