假设我从php中获取了一个包含以下项目的mysql数组:
A,B,B,B
我在数组上做了一个foreach并检查每个项目。对于每个项目,我运行一个返回另一个值的查询。在第一个项目我没有问题,因为以下查询只返回一个项目:
SELECT id, id_ogg FROM rischiatura WHERE id_ruolo = 'RU010000003' AND id_ndg = '$ndg'
其中$ ndg值取自数组。所以在第一次运行中我得到id_ndg ='A'。
在其他运行中,查询每次返回三个结果(没关系 - 数组中有三个相同的项=从此查询返回的三行)。 我的问题是: 在foreach循环内部如何运行此查询将结果限制为第一次返回的第一行,第二次运行中的第二行和第三次运行中的第三行?
起点是:
foreach($items as $ndg){
SELECT id, id_ogg FROM rischiatura WHERE id_ruolo = 'RU010000003' AND id_ndg = '$ndg';
}
我正在寻找一些代码,这些代码既可以用于单个项目,也可以用于B,每次都会返回三个结果中的一个。
答案 0 :(得分:1)
SELECT ... WHERE ... LIMIT 0, 1
SELECT ... WHERE ... LIMIT 1, 1
SELECT ... WHERE ... LIMIT 2, 1
LIMIT
的参数是起始偏移量(可选)和要返回的行数。但如果是我,我会在第一个查询的结果中检测到重复,并只处理一个后续查询中的三行:
# (Remove duplicates from $items, then ...)
foreach($items as $ndg){
$result = mysql_query("SELECT id, id_ogg FROM rischiatura
WHERE id_ruolo = 'RU010000003' AND id_ndg = '$ndg'");
while ($row = mysql_fetch_row($result)) {
# Process each result row: no duplication
}
}
当然,您可以同样的方式使用mysqli
或PDO
;这是为了说明(不认可mysql_*
API)。
答案 1 :(得分:0)
如果像你提到的那样解决:
<?php
$items = array('A', 'B', 'B', 'B');
$unique = array_count_values($items);
foreach ($unique as $key => $value){
for($i = 0; $i < $value; $i++){
echo "SELECT * FROM `bla_bla` WHERE `bla` = '$key' LIMIT $i, 1\n";
}
}
?>
给出
SELECT * FROM `bla_bla` WHERE `bla` = 'A' LIMIT 0, 1
SELECT * FROM `bla_bla` WHERE `bla` = 'B' LIMIT 0, 1
SELECT * FROM `bla_bla` WHERE `bla` = 'B' LIMIT 1, 1
SELECT * FROM `bla_bla` WHERE `bla` = 'B' LIMIT 2, 1