2012-07-24 29 views
1

我想清理我的SQL查詢,並在一個使用JOIN的地方使用TWO查詢。使用JOIN去除多餘的SQL查詢(使用PHP)

這裏是原代碼(PHP):

$cat = "books"; // as a test 

$query = "SELECT category, cat_id FROM master_cat WHERE category = '{$cat}'"; 
$result = mysql_query($query); 

while ($row = mysql_fetch_array($result)) { 
    $cat_id = $row['cat_id']; 
} 

$sql = mysql_query("SELECT item, spam, cat_id FROM items WHERE cat_id = ' " . $cat_id . "' ORDER BY TRIM(LEADING 'The ' FROM item) ASC;"); 

while ($row = mysql_fetch_assoc($sql)) 
    if ($row['spam'] < 2) 
     $output[] = $row; 


print(json_encode($output)); // added! 

我想只是刪除頂部查詢和使用JOIN。更新的SQL語句是這樣的:

編輯:我在原來的問題中犯了一個錯誤。基本上用戶輸入給我們$貓=「東西」。 master_cat表中有一個cat_id的「東西」。該cat_id也位於項目表中。這就是我需要的表連接 - 和WHERE子句需要結合 「$貓」

更新的查詢:

$result = mysql_query("SELECT i.item, i.spam, mc.cat_id AS Category 
FROM items as i 
INNER JOIN master_cat as mc 
ON i.cat_id = mc.cat_id 
WHERE i.cat_id = '{$cat}' 
ORDER BY TRIM(LEADING 'The ' FROM i.item) ASC;"); 

則:

while ($row = mysql_fetch_assoc($result)) 
    if ($row['spam'] < 2) 
     $output[] = $row; 

我在收到此瀏覽器: null。

有人可以指導我如何正確使用JOIN,我知道這將真正清理這裏的東西,並提高編碼效率。我只是看了一個教程,但仍然不太明白。

這裏是最後的代碼,工程

$cat = $_POST['category']; // yes, yes, injection. this is just the short version. 

$result = mysql_query("SELECT i.item, i.cat_id, i.spam, mc.cat_id, mc.category, TRIM(LEADING 'The ' FROM i.item) as CleanItem 
FROM items as i 
INNER JOIN master_cat as mc 
ON i.cat_id = mc.cat_id 
WHERE mc.category = '{$cat}' 
ORDER BY CleanItem ASC;"); 

while ($row = mysql_fetch_assoc($result)) 
    if ($row['spam'] < 2) 
     $output[] = $row; 

回答

2

你有參考WHERE子句中的items表通過其全名,你應該正在使用您創建的別名(i)。

您的ORDER BY條款中也有模糊的列參考item

嘗試將最後兩行更改爲:

WHERE i.cat_id = '{$cat_id}' 
ORDER BY TRIM(LEADING 'The ' FROM i.item) ASC 

您也應該檢查mysql_error()得到錯誤,它會指出你直接到問題的字符串描述。

+0

嘿感謝,這是一個明顯的錯誤,我錯過了。儘管仍然失敗。 – KickingLettuce 2012-07-24 22:10:55

+0

@KickingLettuce'mysql_error()'說什麼?你是否也改變了'ORDER BY'這一行? – DaveRandom 2012-07-24 22:11:55

+0

哦,不,我忘了。但我改變了它,它仍然是空白。 – KickingLettuce 2012-07-24 22:16:22

1

試試這個:

$sql = "SELECT i.item, i.spam, mc.cat_id AS Category 
FROM items as i 
INNER JOIN master_cat as mc ON i.cat_id = mc.cat_id 
WHERE i.cat_id = '{$cat_id}' 
ORDER BY TRIM(LEADING 'The ' FROM item) ASC"; 

如果別名itemsi,你應該使用i其他任何地方。此外,mc.category似乎不存在,所以我用mc.cat_id替換它。 mysql_error說什麼?

2
$sql = "SELECT i.item, i.spam, mc.cat_id AS Category 
FROM items as i 
INNER JOIN master_cat as mc 
ON i.cat_id = mc.category 
WHERE items.cat_id = '{$cat_id}' 
ORDER BY TRIM(LEADING 'The ' FROM item) ASC"; 

既然你別名它,你必須保持它作爲別名:固定倒數第二行:

WHERE i.cat_id = '{$cat_id}' 
1

你可能得到虛假的爲你的迴應初始查詢,而不是一個結果集

你應加入i.cat_id = mc.cat_id

你應該也可能會表現你的i.item清洗(即在select語句中刪除'The')(如果需要保持i.item完好無損,即使是單獨字段),然後按該字段排序。

您應該引用i.cat_id = '{$ CAT_ID]}',而不是items.cat_id

+0

謝謝。我做了trythis(這是我的錯誤),但問題仍然沒有解決... – KickingLettuce 2012-07-24 22:22:28

+0

此外,在選擇「清潔」的偉大提示。我將其添加到我的最終代碼中。 +1。 – KickingLettuce 2012-07-24 22:55:18