2010-08-18 54 views
2

我必須在數據庫中執行SELECT操作。因爲我想縮小搜索結果的範圍,所以想知道是否應該使用嵌套SELECT或使用JOIN操作?加入同一個表?

我想在表格上執行雙重搜索。我不成功嘗試這樣做:

$receive_listings = mysql_query('SELECT * 
            from show_detail 
            WHERE ch_id="0140.zee.in" IN ('SELECT * 
                    FROM show_detail 
                    WHERE `date_column` BETWEEN `2010-08-17` AND `2010-08-18`')' 
           ) or die("ERROR: $receive_by_show_id.".mysql_error()); 

拋出一個錯誤:

Parse error: syntax error, unexpected T_VARIABLE in /Applications/XAMPP/xamppfiles/htdocs/play/browse-channels-shows.php on line 17 

我在想,如果一個JOIN操作會更有效地做的伎倆?

+0

我不喜歡顏色的變化。應該在第二個SELECT前面有一個'嗎? – XstreamINsanity 2010-08-18 18:29:17

+1

當你修復PHP錯誤時,有幾個Mysql-Error-1064:等待你的語法錯誤 – 2010-08-18 18:29:45

+0

你在查詢中究竟做了什麼,你可以在一個select中同時使用日期檢查和ch_id檢查。 – 2010-08-18 19:01:56

回答

1

由於其他人已經解決了你的分析錯誤,你最終會因爲你的查詢不正確而導致第二個錯誤。

我假設你想你的兩個日期之間獲得項目和符合您ch_id:

SELECT * from show_detail WHERE ch_id="0140.zee.in" AND (`date_column` BETWEEN `2010-08-17` AND `2010-08-18`') 
0
$receive_listings = mysql_query('SELECT * from show_detail WHERE ch_id="0140.zee.in" IN (SELECT * FROM show_detail WHERE `date_column` BETWEEN `2010-08-17` AND `2010-08-18`)') or die("ERROR: $receive_by_show_id.".mysql_error()); 

我認爲它可能需要這樣。

1

所有在這裏的答案未能彈出的是雙引號不能用來包圍值。您必須使用單引號。

$receive_listings = mysql_query("SELECT * 
     from show_detail 
     WHERE ch_id='0140.zee.in' IN (SELECT * 
       FROM show_detail 
       WHERE `date_column` BETWEEN '2010-08-17' AND '2010-08-18')") or die("ERROR: $receive_by_show_id. ".mysql_error()); 

應該是MySQL和PHP的正確版本。

1

這是您的查詢重寫爲更具可讀性。

$query <<<EOL 
SELECT * 
FROM show_detail 
WHERE ch_id = "0140.zee.in" IN (
    SELECT * 
    FROM show_detail 
    WHERE `date_column` BETWEEN '2010-08-17' AND '2010-0818' 
); 
EOL; 

您顯然在show_detail表中有多個列,但是您在子查詢中選擇了所有列。這是非法的語法。如果子查詢在IN子句中使用,則子查詢必須返回至多1個值(如果它在相等性測試(... WHERE field = (SELECT someval FROM...))中使用)或一列。你的查詢,如果一切正確,仍然會返回ERROR 1241 (21000): Operand should contain 1 column(s)。因爲CFreak在他的回答中說,除非你有一些完全瘋狂的想法,你不需要子查詢來做到這一點,你只需要一個AND子句。