[英]select … where id = any value. is it possible?
请看这张桌子
table
|id| |name| |order|
我必须得到行,其中name = something
和order = somevalue
所以我写
select `id` from `table` where `name` = 'something' and `order` = 'somevalue'
但依赖于php逻辑,有时我需要获取所有行,其中name = something
,与order
值无关。 我不想改变查询结构,因为在实践中有很多字段,并且可能的查询计数会变得非常大。 所以我想保存查询的结构,当我需要按名称选择时,我想写这样的东西:
select `id` from `table` where `name` = 'something' and `order` = any value
可能吗?
谢谢
嗯,这是一种黑客,但如果你真的需要这样做,它会像这样工作:
select `id` from `table` where `name` = 'something' and `order` = `order`
然后你只是说“无论订单在哪里都是一样的”,所以它总是如此。
不,这是不可能的。 你需要改变结构(可选择改为LIKE,这样你就可以使用'%',但这非常难看)。
但是,您不需要编写不同的查询来处理每个可能的组合。 您可以简单地动态创建查询:
//create base query
$query = "select `id` from `table` where `name` = 'something' ";
//add order if we need it
if ($use_order)
$query .= "and `order` = 'somevalue' ";
//repeat for any other optional part
请注意,您当然应该采取适当的措施来避免SQL注入和其他安全问题 - 我没有在此处包含此内容以简化操作。
如果使用绑定参数,则不可能。
如果您只是替换值,则可以执行以下操作:
select `id` from `table` where `name` = 'something' and `order` = `order`
经过反思,我有一个更好的答案。 我的同事向我展示了这样做的方法。
我的榜样......
Select rentals.* From rentals Where ((? = '') OR (user_id = ?))
变量必须相同。
例如,如果它们都是5,则第一个布尔值将为false,但对于用户id为5的行,第二个布尔值将为true。
如果需要“all”,则设置为空字符串将导致所有行都符合where子句条件。
我认为你没有任何选择......一旦你做了选择,就不能“不过滤”并获得更多行。
您应该只使用两个查询 - 两个独立查询,或者在名称上选择一个临时表,然后(可选)一个进一步选择order属性的查询。
像上面所说的Chad一样,只需将列设置为等于它自己。 但要小心,在某些平台/安装配置上,NULL!= NULL:
select `id` from `table` where `name` = 'something' and coalesce(`order`,'') = coalesce(`order`,'')
这是数据库查询的常见主题 - 您需要一个变量查询,具体取决于您希望对其查询的数据应用多少过滤。 您可以在整个代码中将查询重复为字符串,但这是不好的做法,因为它会不必要地增加代码的复杂性。 如果由于某种原因需要更改查询,则会发生错误,并且必须在多个位置更改它。
更好的解决方案是创建一个为您执行构建查询的函数:
function buildMyQuery($name, $order = null) {
$sql = "SELECT `id` FROM `table` WHERE `name`='$name'";
if ($order != null) {
$sql .= " AND `order`='$order'";
}
return $sql;
}
然后,您可以使用“名称”字段运行此操作:
$query = buildMyQuery("somename");
或者使用这两个字段:
$query = buildMyQuery("somename", "someorder");
如上所述,此代码是故意简化的,并且不包含通过$ name或$ order传递的可能危险数据的意外情况。 在使用任一数据之前,您需要使用mysql_real_escape_string或类似的东西来首先清除数据,在函数的开头。
Byron说,动态查询生成是生活中的事实,所以我现在已经习惯了它,而不是使用hack-ish变通方法。
你不能在这里使用not null
查询吗?
select `id` from `table` where `name` = 'something' and `order` is not null;
你应该能够这样做:
select `id` from `table` where `name` <>'' and `order` <>''
这将选择值不等于空白的任何地方。
$sql = "SELECT * FROM auctions WHERE id = id ";
if ($category !== "ANY") {
$sql .= "AND category = $category "; }
if ($subcategory !== "ANY") {
$sql .= "AND subcategory = $subcategory "; }
if ($country !== "ANY") {
$sql .= "AND country = $country "; }
$sql .= "ORDER BY $order $sort LIMIT $limit OFFSET $offset";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.