请看这张表
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
有可能吗?
感谢
答案 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";