【问题标题】:expression engine sql query entries list by authors表达式引擎 sql 查询条目列表按作者
【发布时间】:2011-08-12 22:32:05
【问题描述】:

如何从一个频道订购最新的 3 个条目,每个条目来自不同的作者? (所以它们最终不会成为同一作者的 3 个最新条目) - 我想我需要使用 SQL 查询吗?

{exp:channel:entries orderby="screen_name|date" channel="portfolios" limit="3" group_id="5" dynamic="no"}
<img src=" {thumbnail}" alt="{title}"/><br />
{title}<br />
{/exp:channel:entries} 

提前致谢!

【问题讨论】:

    标签: sql expressionengine


    【解决方案1】:

    马克 - 这是我在 other dupe question 上发布的答案的转贴:


    由于您需要解析自定义字段,因此这里最好的方法是首先找到来自不同作者的最新 4 个条目的 entry_ids,然后使用 entry_id 参数通过嵌入将它们传递给 channel:entries 标记.

    这应该可以工作(确保将channel_id 替换为适当的整数)。用这个替换你当前的整个代码块:

    {embed="embeds/_latest_per_member" entry_ids="{exp:query sql="SELECT entry_id, author_id FROM exp_channel_titles WHERE entry_date IN( SELECT MAX(entry_date) FROM exp_channel_titles  WHERE status != 'closed' AND channel_id = 1 GROUP BY author_id ) ORDER BY entry_date DESC LIMIT 4" backspace="1"}{entry_id}|{/exp:query}"}
    

    然后您的 embeds/_latest_per_member 模板可能如下所示:

    {exp:channel:entries channel="channel_name" entry_id="{embed:entry_ids}"}
        {author_id}<br />
        <a href="{path=portfolios/gallery/{username}}"><img src="{thumbnail}"></a><br>
        <a href="{path=portfolios/gallery/{username}}">{title}</a><br />
    {/exp:channel:entries}
    

    您曾提到此代码给您一个递归错误 - 这意味着您对嵌入 within 嵌入进行了另一个调用。不要那样做。

    【讨论】:

    • 谢谢 Derek - 我认为这行得通 - 我不可能知道 - 是状态! ee代码还是sql?是“不”的意思吗? backspace=1 有什么作用?
    • != 的意思是“不等于”……可以肯定的是,总体而言,这是一个不平凡的 SQL 查询,但这就是 EE 的力量——你可以用正确的查询做几乎任何事情。有关backspace 参数look here 的更多信息(许多EE 模块标签以完全相同的方式使用它)。
    • 什么是退格删除?如果我删除它似乎可以正常工作。是吗? ? IN(select MAX 是否找到最新的输入日期?同意 EE 功能强大,但现在在论坛中确实缺乏支持。那里也没有很多 SQL Query 示例。
    • 是的,退格键会删除管道,但我想如果没有它,它只会添加一个额外的空 entry_id,这是无害的。 IN([subquery]) 选择按作者分组的最新条目,然后按主查询按时间顺序排列。
    • 此查询需要 30 多秒才能超过 20K 条目
    【解决方案2】:

    WHERE IN (SELECT MAX(entry_date)...) 示例对数据库造成了巨大冲击。它似乎本质上为每个条目做一个子查询。我发现的另一种选择 (Stackoverflow) 在 FROM 部分只使用一个子查询,

    quote:在 ORDER BY 之后做一个 GROUP BY,用 GROUP BY 包装你的查询 :-)。

    无论如何...这将获取所有作者及其最后发布的条目标题。如果您还需要 url_title,则必须将其添加到两个 SELECT 语句中。我添加了一些额外的选项,仅获取过去 4 个月,限制为 channel_id 8,限制为 category_id 68。

    SELECT author_id, screen_name, title, FROM_UNIXTIME(entry_date) AS m_date 
    FROM (
      SELECT t.author_id, t.title, m.screen_name, t.entry_date
      FROM exp_channel_titles AS t
      LEFT JOIN exp_members AS m ON t.author_id = m.member_id
      LEFT JOIN exp_category_posts AS c ON c.entry_id = t.entry_id
      WHERE t.entry_date > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 4 MONTH)) 
      AND t.channel_id = 8
      AND c.cat_id = 68
      ORDER BY t.entry_date DESC
    ) AS S 
    GROUP BY S.author_id
    ORDER BY entry_date DESC
    # LIMIT 10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多