我正在尝试简化一些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循环,但我怀疑有一种方法可以将它们连接成一个。
有什么想法吗?
发布于 2011-11-10 20:49:00
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) DESCSidenotes
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发布于 2011-11-10 20:51:51
你已经在你的帖子评论中收到了一些反馈。您应该真正了解不同类型的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的起点
发布于 2011-11-10 20:50:12
SELECT link from theurl (select urlid from themix (select pageid from where DATE( createdate )='2011-11-09‘ORDER BY createdate DESC))
或
从and中选择链接为tu,选择tm为tm,页面为tp where tu.id=tm.urlid
tm.pageid=tp.id DATE( createdate )='2011-11-09‘ORDER BY createdate
无论如何,它都会给出结果。
https://stackoverflow.com/questions/8079700
复制相似问题