2011-09-17 50 views
0

我有:在查詢中不使用CONCAT

兩種輸入類型用於搜索。一個用於城市,州,郵編,文字的文本字段。另一個是針對「類型」商業搜索的選擇下拉菜單。

我想返回「位置」輸入的結果以及「類型」輸入。因此,如果用戶在「位置」輸入中搜索紐約紐約83745,並在「類型」輸入中搜索沃爾格林,則僅返回紐約紐約的Walgreens,83745。 但是,在我的查詢中使用CONCAT方法限制了這一點。用戶可以在「位置」輸入中使用逗號和空格。但是,「類型」輸入一起被忽略。如果我取出CONCAT並使用基本的單個WHERE子句,則兩種搜索類型只能一起使用。那麼,我怎樣才能讓CONCAT和"AND style LIKE '%$search_type%'";一起工作呢?

$query = "SELECT street, city, state, type FROM location 
    WHERE 
    CONCAT(city, ', ', state, ', ', zip_code) LIKE '%$search_location%' 
    OR CONCAT(city, ' ', state, ' ', zip_code) LIKE '%$search_location%' 
    AND type LIKE '%$search_type%'"; 
+1

現在... * *不能*是很好的指數利用率。用戶輸入也是非常嚴格的。你知道'AND'比'OR'有更高的優先級嗎? 'x OR y AND z'是'x OR(y AND z)'? – 2011-09-17 19:39:32

+0

這是一個縮短的查詢。無論哪種方式,我想弄明白 – Graham

+0

看起來你應該有兩個LIKE表達式的括號。 – Ramon

回答

-1

此語法不受mysql支持。 concat可以合併字符串,而不是列。

這是你最好的選擇,我相信:

$query = "SELECT street, city, state FROM location 
    WHERE 
    (city LIKE '%$search_location%' or state LIKE '%$search_location%' or zip_code LIKE '%$search_location%') 
    AND style LIKE '%$search_type%'"; 

適當匹配的工作:

ALTER TABLE location ADD FULLTEXT(city, state, zip_code); 

$query = "SELECT street, city, state FROM location 
    WHERE match (city, state, zip_code) against ('$search_location' in boolean mode) 
    AND style LIKE '%$search_type%'"; 
+0

如何在位置輸入中添加時髦的標點符號? – Graham

+0

你是什麼意思的「時髦」?應該做的是使用「mysql_real_escape_string($ field)」,一旦連接打開 – roselan

+0

這個答案沒有意義。 'CONCAT'將在列引用上工作得很好 - 你甚至可以用「sql對象」來表示什麼? – Ramon

0

嘗試使用布爾全文搜索 http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html

$query = "SELECT street, city, state, type FROM location 
WHERE 
MATCH ($search_location) AGAINST (CONCAT(city, ' ', state, ' ', zip_code) IN BOOLEAN MODE) 
AND type LIKE '%$search_type%'"; 

我認爲這個例子不起作用,但是如果你會閱讀關於這個問題的s你會發現它

+0

'match(city,state,zip_code)against('布爾模式下的$ search_location')''將會工作,假設'ALTER TABLE位置ADD FULLTEXT(city,state,zip_code);'已經完成。 – roselan

+0

謝謝roselan –