我通过查询获得行数据:
SELECT itemNAME FROM item_list WHERE itemID ='$itemID' AND itemSUB ='$itemSUB'
如果结果为空,我用再次查询
SELECT itemNAME FROM item_list WHERE itemID ='$itemID'
更糟糕的是,它像一样循环运行
foreach ($dataBuffor as $dataItem) {
$query = mysql_query("SELECT itemNAME FROM item_list WHERE itemID ='$itemID' AND itemSUB ='$itemSUB'");
$fetched_data = mysql_fetch_row($query);
$itemNAME = $fetched_data[0];
if ($itemNAME == "") {
$query = mysql_query("SELECT itemNAME FROM item_list WHERE itemID ='$itemID'");
$fetched_data = mysql_fetch_row($query);
$itemNAME = $fetched_data[0];
}
}
如何重做此查询以请求一组数据(插入循环),并在查询本身中包含空结果逻辑?
我希望生产这样的产品:
SELECT itemNAME FROM item_list WHERE itemID ='$itemID' AND itemSUB ='$itemSUB'
if itemNAME == '' (
SELECT itemNAME FROM item_list WHERE itemID ='$itemID'
)
这将导致结果数组不必预先处理SQL查询本身(这非常糟糕)
您可以这样做:
SELECT itemNAME, IF(itemSUB ='$itemSUB', 1, 0) AS `Rank`
FROM item_list
WHERE (itemID ='$itemID')
ORDER BY `Rank` DESC
这将首先返回与两个条件匹配的元素的查询,然后返回仅与一个匹配的元素
您可以尝试:
SELECT itemNAME
FROM item_list
WHERE itemID = '$itemID'
AND ( itemSUB ='$itemSUB' OR itemSUB IS NULL )
ORDER BY itemSUB DESC
LIMIT 1
如果有一行具有匹配的itemSUB,它将是集合中的第一个,因此返回,如果没有,那么该行将是为NULL的行
如果你正在寻找一个列表$itemID
,你可以使用IN
——尽管这不是微不足道的。
SELECT itemID, itemNAME
FROM item_list
WHERE ( itemID, itemSUB ) IN ( $itemIdAndSubList )
OR ( itemID IN ( $itemIdList ) AND itemSUB ID NULL )
ORDER BY itemID, itemSUB DESC
现在这有点奇怪——你匹配的第一个"IN"($itemIdAndSubList
)不是匹配一列,而是匹配一对列(一个元组,给它一个合适的名称)。
列表需要采用以下形式:
( itemID1, itemSUB1 ), ( itemID2, itemSUB2 ), ( itemID3, itemSUB3 )
我认为你需要自己用PHP来构建它。
$itemIdList
更简单,形式为:
itemID1, itemID2, itemID3
最后,您将看到类似这样的内容被发送到mysql(添加新行只是为了格式清晰):
SELECT itemID, itemNAME
FROM item_list
WHERE ( itemID, itemSUB ) IN ( ( itemID1, itemSUB1 ),
( itemID2, itemSUB2 ),
( itemID3, itemSUB3 ) )
OR ( itemID IN ( itemID1,
itemID2,
itemID3 ) AND itemSUB ID NULL )
ORDER BY itemID, itemSUB DESC
一旦您将结果返回到PHP中,您就需要对它们进行循环并提取出您想要的结果。
由于它们是按itemID排序的,那么你只需要为每个给定的itemID取第一条记录,它应该是你想要的。
大致如下:
$itemNames = array();
foreach( $fetched_data as $fetched_row ) {
if (!isset( $fetched_row[ 'itemID' ] ) {
$itemNames[ $fetched_row[ 'itemID' ] ] = $fetched_row[ 'itemNAME' ];
}
}
$itemNames
将包含您需要的数据。
我希望这是有道理的——试着把它放在一起,看看你能走多远。
我认为这是最好的方式。请尝试这个:
SELECT a.itemNAME
FROM item_list a
LEFT JOIN (SELECT itemNAME
FROM item_list
WHERE itemID ='$itemID') b
ON(a.itemSUB=b.itemSUB)
WHERE a.itemID ='$itemID' AND a.itemSUB ='$itemSUB'
最终解决方案,与此问题相关:IN()子句中的SQL查询如下。感谢@RobBaillie和其他贡献者!
SELECT *
FROM item_list
WHERE itemNAME
= ( SELECT itemNAME
FROM item_list
WHERE itemID = '17'
AND (itemSUB ='1' OR itemSUB ='0')
ORDER BY itemSUB DESC
LIMIT 1)
OR itemName
= ( SELECT itemNAME
FROM item_list
WHERE itemID = '57'
AND (itemSUB ='0' OR itemSUB ='0')
ORDER BY itemSUB DESC
LIMIT 1
)
首先修复WHERE子句,这样就可以使用itemID='$itemID' OR itemSUB=$itemSUB
你可以尝试使用类似的东西:
while($row = mysql_fetch_row($query)) {
print $row;
}
这样,您只运行一次查询,然后每次调用fetch_row时,您都会从mysql游标中获得一个新行。
查询结果用完后,$row将为null,while循环将结束。