繁体   English   中英

选择...其中id =任何值。 可能吗?

[英]select … where id = any value. is it possible?

请看这张桌子

table
|id| |name| |order|

我必须得到行,其中name = somethingorder = 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM