[英]MASS WHERE/IN statement, how to handle empty/returned data as well matches?
我有一个问题,希望您能帮助我。
我正在使用WHERE / IN做一个大型的SELECT语句,并为要使用的所有“搜索项”传递一个$ array。
一个简单的例子..(尽管最后$ array更大了)
$harNumArray = (0100001943,0100001944,0100002392,0100007414,0100012110,0100015761,0100015835);
$harNumArray2 = implode(',', $harNumArray);
$results = mysqli_query($mysqli, "SELECT har_id, guar_num FROM placements WHERE har_id IN ($harNumArray2)");
//**outputting the matches values/data from the search (select)**
while ($row = mysqli_fetch_assoc($results)) {
//echo "HAR_ID: ". $row["har_id"]. "\tGUAR_NUM: " . $row["guar_num"] . "\r\n<BR>";
echo $row["har_id"]. "\t" . $row["guar_num"] . "\r\n<BR>";
fwrite($fh, $row["har_id"] . "\t" . $row["guar_num"] . "\r\n");
}
并且可以正常/很好地工作(*感谢msturdy提示)...“何时”存在匹配项。.如果没有匹配项,则不返回任何内容。
但是..例如,如果在数据库中未找到$ harNumArray(索引0)中的第一个值... $ row = mysqli_fetch_assoc($ results循环中未返回任何内容。
仅找到编号..及其与数据库一起提取的匹配/关联数据。
我希望它仍然像这样:
或者像这样可以接受(但上面的布局会更好):
如果在WHERE / IN SELECT中找不到$ harNumArray数组中的第一个数字,则它不返回任何值(这很有意义)。
但是,我需要考虑不匹配项,并插入一个空格(或其他内容)以保持最终“列表”(文本文件)的间距/顺序
我该怎么做呢?
谢谢!
编辑::
这是代码的当前状态:(仍然不返回任何匹配项)
@卡尔
//stack overflow approach:
//format array data
$harNumArray2 = "'" . implode("','", $harNumArray) . "'"; //single quotes
//$harNumArray2 = implode(',', $harNumArray); //no quotes
//$harNumArray2 = '"' . implode('","', $harNumArray) . '"'; //double quotes
//print_r("ARRAY CHECK: " . $harNumArray2);
$results = mysqli_query($mysqli, "SELECT har_id, guar_num FROM placements WHERE har_id IN ($harNumArray2) ORDER BY har_id ASC") or die(mysql_error());
//$results = mysqli_query($mysqli, "SELECT har_id, guar_num FROM placements WHERE har_id IN (" . $harNumArray2 . ") ORDER BY har_id ASC") or die(mysql_error());
echo("<BR>");
print_r("SELECT har_id, guar_num FROM placements WHERE har_id IN ($harNumArray2)");
echo("<BR>");
$rows = array();
while($row = mysqli_fetch_assoc($results)) {
$rows[$row['har_id']] = $row;
}
foreach ($harNumArray as $id){
if (isset($rows[$id])){
//... do something with $rows[$id]
print_r($rows[$id] . "<BR>");
}else{
//... no match for $id
print_r("....no match....");
echo("<BR>");
}
}
仍然没有匹配项返回...无论单引号,无引号还是双引号..
难过吗
谢谢
更新二:
@ Cal-
好的,我运行了您提供的代码。
这是我的输出:
数组([har_id] => 000100007537 [guar_num] => 0000676798)数组([har_id] => 000100007538 [guar_num] => 0000676798)数组([har_id] => 000100007539 [guar_num] => 0000676798)数组([har_id] => 000100007768 [guar_num] => 0000675266)数组([har_id] => 000100007769 [guar_num] => 0000675266)
DB中的HAR_ID = varchar(12)
DB中的GUAR_NUM = varchar(12)
如果我将#results查询中的引号保留为OFF,则会得到数据的回报。(但无论如何。都找不到匹配项)
执行查询:
$harNumArray = array(
'0100001943',
'0100001944',
'0100002392',
'0100007414',
'0100012110',
);
$harNumArray2 = "'".implode("','", $harNumArray)."'";
$results = mysqli_query($mysqli, "SELECT har_id, guar_num FROM placements WHERE har_id IN ($harNumArray2)");
然后建立您的结果图:
$rows = array();
while ($row = mysqli_fetch_assoc($results)) {
$rows[$row['har_id']] = $row;
}
然后,您可以遍历您的ID来检查匹配项:
foreach ($harNumArray as $id){
if (isset($rows[$id])){
... do something with $rows[$id]
}else{
... no match for $id
}
}
更新1:
听起来您的查询未返回任何内容。 运行此代码:
$results = mysqli_query($mysqli, "SELECT har_id, guar_num FROM placements LIMIT 5");
while ($row = mysqli_fetch_assoc($results)) print_r($row);
然后使用输出更新您的问题。 听起来您的数据库并不完全包含您的想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.