2011-09-10 287 views
1

我正在使用以下mysql查詢從我的數據庫中返回一些數據。目前只有cities表中包含任何內容,並且我注意到此查詢將僅返回它找到的第一個匹配條目,而不是它找到的所有匹配條目。有沒有一種方法可以修改此查詢,以便它將返回所有表中的所有匹配結果?麻煩放在一起mysql查詢

想法是,如果我去了$ query ='h'那麼查詢應該返回所有以h開頭的事件,場地和城市。

SELECT name, 'Events' as source 
FROM events 
WHERE name LIKE '".$query."%' 
UNION ALL  
SELECT name, 'Venues' as source 
FROM venues 
WHERE name LIKE '".$query."%' 
UNION ALL 
SELECT name, 'Cities' as source 
FROM cities 
WHERE name LIKE '".$query."%' 
OR FIND_IN_SET('".$query."%', Alternate_name) 

請解釋我如何解決它,而不是隻發佈一個解決方案。我仍然在學習,想要理解。

編輯:

的對取代後的查詢(用含有字母h的$查詢變量):

SELECT name, id, 'Events' as source FROM events_basic WHERE name LIKE 'h%' UNION ALL 
SELECT name, fsq_id, 'Venues' as source FROM venues_cache WHERE name LIKE 'h%' UNION ALL 
SELECT name, geo_id, 'Cities' as source FROM static_cities WHERE name LIKE 'h%' OR FIND_IN_SET('h%', alternate_names) 

我使用的PHP代碼如下: '

$query = 'h'; 

$query = $this->db->query("SELECT name, 'Events' as source FROM events WHERE name LIKE ".$query."%' UNION ALL 
SELECT name, 'Venues' as source FROM venues WHERE name LIKE '".$query."%' UNION ALL 
SELECT name, 'Cities' as source FROM cities WHERE name LIKE '".$query."%' OR IND_IN_SET('".$query."%', Alternate_name)"); 
    if($query->num_rows > 0) 
    { 
     $results = $query->row_array(); 
     print_r($results); 
    }` 

這個想法是變量$查詢包含一個事件,城市或地點的名稱或部分名稱。該查詢應該返回匹配給定名稱的事件,場地和城市的名稱。我希望我已經澄清,如果沒有,我會盡力澄清更多。

+1

你的SQL似乎是正確的。你不解釋FIND_IN_SET條件,但由於它是ORed我猜測它沒有造成任何麻煩。你能否通過給出一些數據樣本來進一步解釋,以說明問題到底是什麼? – wisefish

+0

可以請你發佈你的php代碼執行這個sql查詢和獲取語句嗎? – Astha

+0

我已經用php代碼編輯了我的問題。 – Derek

回答

0

您可以在之後發佈SQL查詢進行替換嗎?它看起來像你將第二個單引號字符放在串聯中的錯誤位置,產生短語(例如)WHERE name LIKE 'h'%而不是WHERE name LIKE 'h%'(注意第二個引號在第二個版本中的位置差異) 。

如果您的城市名稱爲H(僅H)或名稱列表中的備用名稱僅爲「H」,則會導致出現這種情況。真的嗎?

而且,既然你問了解釋:

  • 你放置備用城市名稱在一個逗號分隔場的技術違反了數據庫標準化的校長。 「適當的」結構是創建一個包含兩列「名稱」和「備用」的新表格。具有其他名稱的城市在替代表中爲每個替代名稱獲取一個條目。除此之外,這將允許您針對備用名稱進行搜索,以使用當前版本中城市搜索無法實現的索引。

  • 您必須非常確定您已經「清理」了變量$ query的內容,以確保某人不在您的站點上啓動SQL注入攻擊(在這種攻擊中,他們將實際的SQL命令寫入查詢字段)。更好的是,查看並使用服務器爲您執行此替換的參數化查詢。

+0

當然,替換後的查詢如下: 有趣的是,我不知道替代名稱違反了db規範化。我從geonames.org項目中得到了城市表格,它帶有一列,其中列出了所有備用名稱。 我會在輸入進入查詢前清理輸入。目前我只是手動填充變量來測試查詢,以確保我得到正確的結果。 – Derek

+0

替換後的查詢對我來說看起來是正確的。如果你只對static_cities表執行單個SELECT,會發生什麼?一排還是幾排?你可以發佈你想要返回的行的數據嗎? –

+0

我發現了我的錯誤。查詢是好的,由於某種原因,我寫了'$ query-> row_array();'它只返回第一行而不是'$ query-> result_array();'返回整個結果集。另一個問題 - 有沒有一種方法可以確定僅來自Venues表的結果數量(而不是循環遍歷整個結果集)? – Derek

0

WHERE子句中FIND_IN_SET的預期結果是什麼?根據您提供的信息,您應該可以忽略這一點。

如果你正在尋找匹配從表替代城市名,可以這樣考慮:

WHERE name LIKE '".$query."%' OR alternate_name LIKE '".$query."%'; 

請確保您消毒輸入。有人可能會使$ query ='1; DROP TABLE場地;'

+0

FIND_IN_SET記錄在MySQL文檔中。 –