2015-09-26 66 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