我很想知道是否可以使用PDO将值数组绑定到占位符.这里的用例试图传递一个值数组以用于IN()
条件.
我希望能够做到这样的事情:
<?php
$ids=array(1,2,3,7,8,9);
$db = new PDO(...);
$stmt = $db->prepare(
'SELECT *
FROM table
WHERE id IN(:an_array)'
);
$stmt->bindParam('an_array',$ids);
$stmt->execute();
?>
Run Code Online (Sandbox Code Playgroud)
并让PDO绑定并引用数组中的所有值.
目前我正在做:
<?php
$ids = array(1,2,3,7,8,9);
$db = new PDO(...);
foreach($ids as &$val)
$val=$db->quote($val); //iterate through array and quote
$in = implode(',',$ids); //create comma separated list
$stmt = $db->prepare(
'SELECT *
FROM table
WHERE id IN('.$in.')'
);
$stmt->execute();
?>
Run Code Online (Sandbox Code Playgroud)
这当然能完成这项工作,但只是想知道是否有一个内置的解决方案我缺席了?
我在数据库中有两个重复项,我想检查,所以我做了什么看到重复,我这样做:
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)
这样,我将获得所有具有related_field的行不止一次.此查询需要几毫秒才能执行.
现在,我想检查每个重复项,所以我想我可以在上面的查询中使用related_field选择some_table中的每一行,所以我喜欢这样:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
Run Code Online (Sandbox Code Playgroud)
由于某种原因(这需要几分钟),结果显然是极慢的.究竟是什么让它变慢?related_field已编入索引.
最后我尝试从第一个查询创建一个视图"temp_view" (SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1)
,然后再这样做我的第二个查询:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
Run Code Online (Sandbox Code Playgroud)
这很好用.MySQL在几毫秒内完成此任务.
这里有任何SQL专家可以解释发生了什么吗?
如何在Laravel中进行此查询:
SELECT
`p`.`id`,
`p`.`name`,
`p`.`img`,
`p`.`safe_name`,
`p`.`sku`,
`p`.`productstatusid`
FROM `products` p
WHERE `p`.`id` IN (
SELECT
`product_id`
FROM `product_category`
WHERE `category_id` IN ('223', '15')
)
AND `p`.`active`=1
Run Code Online (Sandbox Code Playgroud)
我也可以通过连接来做到这一点,但我需要这种格式来提高性能.
在SQL语句中通过%s使列表(countryList)可用的正确方法是什么?
# using psycopg2
countryList=['UK','France']
sql='SELECT * from countries WHERE country IN (%s)'
data=[countryList]
cur.execute(sql,data)
Run Code Online (Sandbox Code Playgroud)
就像现在一样,它在尝试运行"(ARRAY [...])中的WHERE国家"后出错.除了通过字符串操作之外,有没有办法做到这一点?
谢谢
我会像这样创建一个QueryOver
SELECT *
FROM Table
WHERE Field IN (1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)
我尝试过Contains
方法,但我遇到了异常
"System.Exception:无法识别的方法调用:System.String:Boolean包含(System.String)"
在这里我的代码
var qOver = _HibSession.QueryOver<MyModel>(() => baseModel)
.JoinAlias(() => baseModel.Submodels, () => subModels)
.Where(() => subModels.ID.Contains(IDsSubModels))
.List<MyModel>();
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用LINQ-to-EF查询表单的数据:
class Location {
string Country;
string City;
string Address;
…
}
Run Code Online (Sandbox Code Playgroud)
通过元组(国家,城市,地址)查找位置.我试过了
var keys = new[] {
new {Country=…, City=…, Address=…},
…
}
var result = from loc in Location
where keys.Contains(new {
Country=loc.Country,
City=loc.City,
Address=loc.Address
}
Run Code Online (Sandbox Code Playgroud)
但LINQ不希望接受匿名类型(我理解是在LINQ中表示元组的方式)作为Contains()的参数.
是否有一种"好"的方式在LINQ中表达这一点,同时能够在数据库上运行查询?或者,如果我只是迭代密钥和Union() - 一起编写查询,这会对性能有害吗?
在where子句中使用case是否可行?像这样的东西:
DECLARE @Status VARCHAR(50);
SET @Status='published';
SELECT * FROM Product P
WHERE P.Status IN (CASE WHEN @Status='published' THEN (1,3)
WHEN @Status='standby' THEN (2,5,9,6)
WHEN @Status='deleted' THEN (4,5,8,10)
ELSE (1,3)
END)
Run Code Online (Sandbox Code Playgroud)
此代码提供错误:','附近的语法不正确.
我有多个条件要检查,如下所示,
if(pouch.getStatus().equals("Finalized") || pouch.getStatus().equals("Ready")
|| pouch.getStatus().equals("Checkout") || pouch.getStatus().equals("Confirmed")
|| pouch.getStatus().equals("Book") || pouch.getStatus().equals("Started")
|| pouch.getStatus().equals("Inital") || pouch.getStatus().equals("Close")) {
// Body
}
Run Code Online (Sandbox Code Playgroud)
是否有任何简单的方法来检查类似SQL IN
条件的上述条件,以便代码看起来更简单?
是否可以通过FMDB将数组传递给SELECT ... WHERE ... IN语句?我试图像这样内爆数组:
NSArray *mergeIds; // An array with NSNumber Objects
NSString *mergeIdString = [mergeIds componentsJoinedByString:@","];
NSString *query = @"SELECT * FROM items WHERE last_merge_id IN (?)";
FMResultSet *result = [database executeQuery:query, mergeIdString];
Run Code Online (Sandbox Code Playgroud)
这只适用于数组中只有一个对象,这使我相信FMDB在整个内爆字符串周围添加了引号.
所以我尝试将数组传递给FMDB的方法:
NSArray *mergeIds; // An array with NSNumber Objects
NSString *query = @"SELECT * FROM items WHERE last_merge_id IN (?)";
FMResultSet *result = [database executeQuery:query, mergeIds];
Run Code Online (Sandbox Code Playgroud)
这根本不起作用.
我没有在README或FMDB的github页面上的示例中找到任何关于它的内容.
谢谢,斯特凡
我有一个数据库,其中有四列对应于起始位置和结束位置的地理坐标x,y.列是:
我有这四列的索引,序列为x0,y0,x1,y1.
我列出了大约一百个地理对的组合.我如何有效地查询这些数据?
我想按照这个SO答案的建议做这样的事情,但它只适用于Oracle数据库,而不适用于MySQL:
SELECT * FROM my_table WHERE (x0, y0, x1, y1) IN ((4, 3, 5, 6), ... ,(9, 3, 2, 1));
Run Code Online (Sandbox Code Playgroud)
我以为可能有可能对索引做点什么?什么是最好的方法(即:最快的查询)?谢谢你的帮助!
笔记:
编辑:
代码按原样实际工作,但它非常慢,并没有利用索引(因为我们有一个旧版本的MySQL v5.6.27
).