2015-09-26 85 views
1

我为我的网站建立了一个广告系统,首先尝试根据位置和类别找到特定的广告。失败意味着它选择只基于位置,失败意味着它选择了一个通用的广告:建立一个if语句到mysqli搜索

$sql = "SELECT * FROM ads WHERE city='$city' AND category='$category' LIMIT 1"; 
$user_query = mysqli_query($db_conx, $sql); 

if(mysqli_num_rows($user_query)==0){ 
    $sql = "SELECT * FROM ads WHERE city='$city' AND category='All' LIMIT 1"; 
    $user_query = mysqli_query($db_conx, $sql); 

if(mysqli_num_rows($user_query)==0){ // 'City' is the generic all locations 
    $sql = "SELECT * FROM ads WHERE city='City' AND category='All' LIMIT 1"; 
    $user_query = mysqli_query($db_conx, $sql); 
    } 
} 

我想这可能可以写一个mysqli的语句来完成所有3级的操作,但似乎没有什么正常工作。 (我尝试使用各种版本的联盟和限制1)。 是否有可能做这样的事情,还是最好保持原样?

+0

您可能会更好地创建一个SQL存储过程来计算逻辑,而不是在应用程序和数据库之间来回切换。 – Reisclef

回答

0
$sql = "SELECT * FROM ads WHERE city='$city' AND category='$category' 
     UNION 
     SELECT * FROM ads WHERE city='$city' AND category='All' 
     UNION 
     SELECT * FROM ads WHERE city='City' AND category='All' LIMIT 1"; 
$user_query = mysqli_query($db_conx, $sql); 

只是让MySQL的做肮脏的工作

1

我想解决这个使用CASE

SELECT *, CASE 
WHEN city='$city' AND category='$category' THEN 1 
WHEN city='$city' THEN 2 
WHEN category='$category' THEN 3 
ELSE 4 
END as rating 
FROM ads 
WHERE city IN('$city', 'All') AND category IN('$category', 'All') 
ORDER BY rating ASC 

这是更灵活的那么UNION,并允许您调整优先

+0

我从来没有见过CASE。看起来很有趣,我必须检查一下。 – user2067101