我正在尝试简化一些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循环,但怀疑有一种方法可以将它们全部合并到一起。
有什么想法吗?
答案 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
(来自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
答案 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。