【问题标题】:codeigniter : want not first but last row of joined table?codeigniter:不想第一行而是最后一行加入表?
【发布时间】:2012-12-01 04:49:12
【问题描述】:

现在我的联接表返回第一个帖子行,我希望它具有每个主题的最后一行

这是我现在的代码

$this->db->select('*');
      ->where('disccategory_id', $cat);
       ->from('discussiontopics as topics');
       ->join('discussionposts as posts', 'posts.topic_id = topics.id', 'left');
       ->order_by('posts.id', 'desc');
       ->group_by('topics.id');

也许我只能通过连接内的选择来做到这一点?但不确定如何使用 Codeigniter 的 Active Record 来做到这一点

【问题讨论】:

  • 你不能用相反的方式订购它并选择顶部吗?还是去底部?
  • $this->db->order_by('posts.id', 'asc');不会改变结果。我只得到一排

标签: codeigniter activerecord


【解决方案1】:
$this->db->query("
SELECT *
FROM (  SELECT *,
            topics.id AS topic_id
        FROM discussiontopics as topics
        LEFT JOIN discussionposts as posts
        ON posts.topic_id = topics.id
        ORDER BY posts.id DESC) AS h
GROUP BY topic_id
");

如果您想知道为什么您的查询不起作用,请在运行查询后运行 echo $this->db->last_query();,您会看到 if 的行为如何。

【讨论】:

  • 这就是我解决它的方法$query = $this->db->query(" SELECT * FROM discussiontopics as topics LEFT JOIN ( SELECT * FROM discussionposts ORDER BY id DESC) AS selectedposts ON (selectedposts.topic_id = topics.id) WHERE topics.disccategory_id = $cat GROUP BY topics.id; ");
  • 将值解析为query() 时,通过第二个参数将它们作为数组发送。 query(" .. topics.disccategory_id = ? ..", array($cat)) 这将使您免受 SQL 注入攻击。
【解决方案2】:

其实应该不行,原因是ORDER BY是在分组后执行的,如果你写

->order_by(...)
->group_by(...)

->group_by(...)
->order_by(...)

没关系,查询总是在ORDER BY之前有GROUP BY

这里讨论了您最有可能遇到的问题:

MySQL Order before Group by

所以我宁愿使用手动编写查询

$this->db->query('
    SELECT ...
');

或者甚至获取行列表(您的查询没有分组)并且只取第一个。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2023-04-02
    相关资源
    最近更新 更多