从两个表中选择,由第一个表限制

时间:2014-12-29 21:40:57

标签: mysql limit

我一直在寻找解决方案好几天了,我开始觉得自己像个白痴。

我有两张桌子。

entries                       link
+----------+-------+-----+    +----------+------+
| date     | title | txt |    | date     | tag  |
+==========+=======+=====+    +==========+======+
|2014-01-01| titl1 | txt1|    |2014-01-01| tag1 |
|2014-01-02| titl2 | txt2|    |2014-01-01| tag2 |
|2014-01-03| titl3 | txt3|    |2014-01-01| tag3 |
|2014-01-04| titl4 | txt4|    |2014-01-02| tag1 |
|2014-01-05| titl4 | txt4|    |2014-01-02| tag2 |
|2014-01-06| titl4 | txt4|    |2014-01-03| tag1 |
|2014-01-07| titl4 | txt4|    |2014-01-04| tag2 |
|2014-01-08| titl4 | txt4|    |2014-01-04| tag4 |
+----------+-------+-----+    +~~~~~~~~~~+~~~~~~+ 'link' continues

我希望*来自'条目',按'日期'排序,受4限制,以及所有对应'标记'来自每个条目的'link'。

'条目'中的'日期'是主键,如果这很重要的话。 'link'没有主键,因为'date'和'tag'都会重复。

在这里发帖是最后的手段,因为我一般不喜欢依靠帮助来完成任务,但我完全没有精神能力继续尝试。

我有这个查询,它抓取一个条目和相应的标记,并且限制为4,但它不会为每个条目获取/ all / tags。

SELECT date, title, txt
FROM entries
WHERE date IN (
    SELECT date
    FROM link
    WHERE date = entries.date
)
LIMIT 4

如果我'反过来'并尝试,

SELECT date, tag
FROM link
WHERE date IN (
    SELECT date
    FROM entries
    WHERE date = link.date
)
LIMIT 4

它限制了'link'四行。

我真的希望我已经解释了我想要的东西。如果我不清楚,我可以再试一次。

3 个答案:

答案 0 :(得分:0)

不确定你究竟在问什么。 此查询返回前四个条目及其关联的标记

select a.date, a.title, a.txt , l.tag
from
(select date, title, txt 
from entries
limit 4) a,
link l
where l.date = a.date

不确定mysql中的rownum(oracle)是什么,根据你的帖子猜测它的限制。

答案 1 :(得分:0)

以下查询将为您提供最多4个日期(按升序排列),并且所有关联的标记在tags计算字段中连接成逗号分隔的字符串。当然没有显示WHERE条件(我在你的问题中没有看到有意义的WHERE),所以我想你想要添加一个使这个有意义(即每次都不返回前4个日期)。还不清楚你想要使用什么样的顺序。在没有相关LIMIT子句的情况下使用ORDER BY通常是不好的形式,因为您可能会得到意想不到的结果。我根据日期假设了一个升序排序。

SELECT
    e.`date` AS `date`,
    e.title AS title,
    e.txt AS txt,
    GROUP_CONTAT(l.tag) AS tags
FROM entries AS e
LEFT JOIN link AS l
    ON e.`date` = l.`date`
ORDER BY e.`date` ASC
WHERE ???
LIMIT 4

注意:如果您只想在INNER JOIN中包含一些相关记录的LEFT JOIN记录,请使用entries代替link。您还可以考虑使用保留字date以外的字符串作为列名。

答案 2 :(得分:0)

我得到了我想要的东西,

SELECT *
FROM (
    SELECT date AS date
    FROM entries
    ORDER BY date DESC
    LIMIT 4
) AS ent, link
WHERE ent.date = link.date

这为我提供了条目及其所有标签,并限制了四个条目,而没有关闭标签。

它输出类似于:

的模式
2014-01-04 tag4
2014-01-04 tag2
2014-01-03 tag1
2014-01-02 tag2
2014-01-02 tag1
2014-01-01 tag3
2014-01-01 tag2
2014-01-01 tag1

这就是我想要的。

我花了几个小时才冷静下来,然后离开代码,有时候,这就是你所需要的。