[typecho]sql编写中的一些问题

前言

在typecho的插件编写中,有涉及到数据表的调用,但官网的文档只简单的说了些许调用规则,没有十分复杂的查询。
我这里将我最近用到的查询方式列出来。

表,列信息

表名列1列2列31
t1id_strtextis_delete
t2id_strother_id_str---

简单的查询

$queryT=$db->select()->from('table.t1')
->where('table.t1.user_id_str=?','admin')
->order('table.t1.is_delete', Typecho_Db::SORT_DESC);
$current = $db->fetchAll($queryT);

1.多表查询

多表查询,使用join方法进行连接:

$sql=$db->select('table.t1.*')->from('table.t1')
->join('table.t2', 'table.t1.id_str = table.t2.id_str',Typecho_Db::LEFT_JOIN)
->order('table.t1.is_delete', Typecho_Db::SORT_DESC);
$current = $db->fetchAll($sql);

可以看到只是增加了join方法,并且指定是Typecho_Db::LETF_JOIN,也就是左连接,主表是t1

2.like条件

想来很多时候都需要用like做查询

$querySql=$this->db->select()->from('table.t1')
        ->where('table.t1.id_str=?','xxx')
        ->where("table.t1.text like ?",'%#daily%')
        ->order('table.TwitterTimeline.id_str',Typecho_Db::SORT_DESC)
        ->limit(1);
$links = $this->db->fetchObject($querySql);

可以看到这一行->where("table.t1.text like ?)",'%#daily%'),将'%#daily%'作为like后面的条件。

3.or条件

当使用or的时候,要注意下性能方面的问题。

$querySql=$this->db->select()->from('table.t1')
        ->where('table.t1.id_str=?','xxx')
        ->orWhere("table.t1.text like ?",'%#daily%')
        ->order('table.TwitterTimeline.id_str',Typecho_Db::SORT_DESC)
        ->limit(1);
$links = $this->db->fetchObject($querySql);

我这里将第二个例子改了下,使用orWhere,方法代替了。

4.and,or并用

在这种复杂的条件中,需要明确一点,就是你要并列的括号要一一对应。

$querySql=$this->db->select()->from('table.t1')
        ->where('table.t1.id_str=?','xxx')
        ->where("(table.t1.text like ?",'%#daily1%')
        ->orWhere("table.t1.text like ?)",'%#daily%')
        ->order('table.TwitterTimeline.id_str',Typecho_Db::SORT_DESC)
        ->limit(1);
$links = $this->db->fetchObject($querySql);

这样,只要满足text中包含#daily1或者#daily的行,都会被查出来。

最后

在调试的过程中,最好直接将查询打印出来,就能明确有问题的语句。


本文作者:小蚊子
本文链接:[typecho]sql编写中的一些问题 - https://djc8.cn/archives/some-problems-in-writing-typecho-sql.html
版权声明: 知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

标签: sql, php

添加新评论