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

时间:2010-05-20 22:35:36

标签: php mysql phpmyadmin

请看这张表

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 

有可能吗?

感谢

10 个答案:

答案 0 :(得分:11)

嗯,这是一种黑客行为,但如果你真的需要这样做,它会像这样工作:

select `id` from `table` where `name` = 'something' and `order` = `order`

然后你只是在说“订单与其本身相同的地方”,所以它总是如此。

答案 1 :(得分:5)

不,这是不可能的。你需要改变结构(可选择改为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注入和其他安全问题 - 我没有在此处包含此内容以简化操作。

答案 2 :(得分:2)

如果使用绑定参数,则无法实现。

如果您只是替换值,则可以执行以下操作:

select `id` from `table` where `name` = 'something' and `order` = `order`

答案 3 :(得分:0)

我认为您没有任何选择......一旦您做出选择,您就无法“不过滤”并获得更多行。

您应该只使用两个查询 - 两个独立查询,或者一个在名称中选择临时表的查询,然后(可选)一个进一步选择订单属性的查询。

答案 4 :(得分:0)

如上所述Chad,只需将列设置为等于自身。但是请注意,在某些平台/安装配置上,NULL!= NULL:

select `id` from `table` where `name` = 'something' and coalesce(`order`,'') = coalesce(`order`,'')

答案 5 :(得分:0)

这是数据库查询的常见主题 - 您需要一个变量查询,具体取决于您希望对其查询的数据应用多少过滤。您可以在整个代码中将查询重复为字符串,但这是不好的做法,因为它会不必要地增加代码的复杂性。如果由于某种原因需要更改查询,则会出现错误,并且必须在多个位置更改查询。

更好的解决方案是创建一个为您执行构建查询的函数:

function buildMyQuery($name, $order = null) {
    $sql = "SELECT `id` FROM `table` WHERE `name`='$name'";

    if ($order != null) {
        $sql .= " AND `order`='$order'";
    }

    return $sql;
}

然后您可以使用'name'字段运行它:

$query = buildMyQuery("somename");

或者使用这两个字段:

$query = buildMyQuery("somename", "someorder");

如上所述,此代码是故意简化的,并且不包含通过$ name或$ order传递的可能危险数据的意外情况。在使用任一数据之前,您需要使用mysql_real_escape_string或类似的东西来首先清除数据,在函数的开头。

动态查询生成是Byron所说的生活中的一个事实,所以我现在已经习惯了它,而不是使用hack-ish解决方法。

答案 6 :(得分:0)

经过反思,我有一个更好的答案。我的同事向我展示了一种可以做到这一点的方法。

我的例子......

Select rentals.* From rentals Where ((? = '') OR (user_id = ?))

变量必须相同。

如果它们都是5,例如,第一个布尔值将为false,但第二个布尔值为true,对于用户id为5的行。

如果您需要" all",设置为空字符串将导致所有行都被视为符合where子句条件。

答案 7 :(得分:0)

你不能在这里使用not null查询吗?

select `id` from `table` where `name` = 'something' and `order` is not null;

答案 8 :(得分:0)

你应该能够这样做:

select `id` from `table` where `name` <>'' and `order` <>''

这将选择值不等于空白的任何地方。

答案 9 :(得分:-1)

$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";