执行选择时跳过一些列

时间:2013-07-31 11:34:44

标签: php mysql codeigniter

我正在构建一个ajax web应用程序,我在jquery中显示一个链选择,在幕后进行一些选择,节省了大量时间编写新的路由和视图。但是,我想知道是否有办法我可以通过不写新模型来进一步减少我的工作。

我有controller

<?php
class Tools extends CI_Controller {

    public function message($to = 'World')
    {
        echo "Hello {$to}!".PHP_EOL;
    }
    public function boom(){
    echo "boom".PHP_EOL;
    }
    public function q(){
    $sql = "SELECT * FROM members WHERE member_id = ? AND member_club_id = ? AND membership_year = ?";

    $count = $this->db->query($sql, array(null, 1, null));
    foreach ($count->result() as $row)
    {
    echo $row->member_name . PHP_EOL; 
    }
    }
}
?>

尝试跳过某些列并显示其他列。

这是它的SQL等价物

SELECT * FROM members WHERE member_id = null AND member_club_id = 1 AND membership_year = null;

他们都没有显示任何内容。有没有办法可以跳过我选择的专栏?。

3 个答案:

答案 0 :(得分:1)

您可以显式设置返回哪些列

SELECT id, member_name FROM members WHERE member_id = null AND member_club_id = 1 AND membership_year = null;

如果您的意思是“跳过行”,则可以使用LIMIT

SELECT * FROM members WHERE member_id = null AND member_club_id = 1 AND membership_year = null LIMIT 5, 5;

这将返回第6,7,8,9和10行的所有列

答案 1 :(得分:1)

你的意思是跳过声明where部分的列吗?

您的查询未返回任何行的原因是因为与null相比时,任何内容都将计算为false:

    无论列的值如何,
  • column = null都为false
  • 列&lt;&gt;无论列的值
  • ,null也都是false

如果您真的不想修改查询生成,可以使用以下内容:

SELECT * FROM members 
WHERE (? is null OR member_id = ?) 
  AND (? is null OR member_club_id = ?) 
  AND (? is null OR membership_year = ?)

但是我不建议这样做,因为数据库引擎在识别一个好的索引以解决查询时会遇到这样的语句。我首选的解决方案是根据收到的参数动态生成SQL。仅当值不为空时才会插入条件。

答案 2 :(得分:0)

这真是奇怪或不是

SELECT * FROM members WHERE member_id = (select member_id) AND member_club_id = 1 AND membership_year = (select membership_year);

SELECT * FROM members WHERE member_id = (select member_id) AND member_club_id = (select member_club_id=1) AND membership_year = (select membership_year);

两个查询都有效。