我在没有代码的情况下问这个问题,因为我想知道很多方法如何 NOT 返回行?我现在使用的并不是那么整洁。我现在使用的是' 1 = 2'它总是在没有行的情况下返回。
所以我问的是如何在sql语句中不返回行的一个很好的方法。
更新
$sql = 'SELECT `a`.`id`,
`a`.`action_id`,
DATE_FORMAT(FROM_UNIXTIME(a.`time`), "%d-%m-%Y") as `date`,
DATE_FORMAT(FROM_UNIXTIME(a.`time`), "%H:%i") as `time`,
`a`.`amount_other_callers`,
`a`.`additional_data_incident`,
`a`.`additional_data_result`,
`a`.`additional_data_messagequality_start`,
`a`.`additional_data_messagequality_end`,
`a`.`additional_data_smsquality_start`,
`g`.`name` AS gemeente
FROM `actions` a
INNER JOIN actions_geo_communities AS ac
ON ac.lnk_action_id = a.id
INNER JOIN geodata_communities g
ON ac.lnk_community_id = g.id ';
if(Auth::user()->unit_id > 0) {
$sql.= ' INNER JOIN actions_geo_units AS au
ON au.lnk_action_id = a.id ';
}
if(Session::get('tk') === "1" && Session::get('ntk') === "1")
{
$sql.= ' WHERE `a`.`aangevuld` = 0 AND `a`.time > 1388530800';
}
else if (Session::get('tk') == 1)
{
$sql.= ' WHERE `a`.`aangevuld` = 0 AND `a`.`tk` = 1 AND `a`.time > 1388530800';
}
else if (Session::get('ntk') == 1)
{
$sql.= ' WHERE `a`.`aangevuld` = 0 AND `a`.`tk` = 0 AND `a`.time > 1388530800';
}
else
{
$sql.= ' WHERE 1=2';
}
if(Auth::user()->unit_id > 0) {
$sql.= ' AND `au`.`lnk_unit_id` = ' . Auth::user()->unit_id . ' ';
}
if(!empty($not_arr)) {
$sql.= ' AND `a`.`id` NOT IN (' . implode(',', $not_arr) . ') ';
}
答案 0 :(得分:3)
最佳答案不是运行查询,您不需要任何数据,所以为什么要对数据库施加压力
在您的情况中,检查是否先检查了两个或一个复选框,然后运行您的查询,否则根本不运行
答案 1 :(得分:1)
当模块需要增加其他模块组装的SQL时,我遇到过这种情况。基于我事先了解的传入SQL部分的结构,我做了其中一个:当我刚刚有一个WHERE条件时,我将其转换为FALSE AND (<original_where)
,或者如果它没有破坏其他模块则简单地为FALSE。在其他情况下(当复杂查询有多个WHERE子句和WHERE之后的其他子句时)我很幸运,系统没有使用LIMIT,所以我可以自由地追加LIMIT 0