[英]html select multiple choice input, store them in mysql db and search for matches
我的問題首先(很多...信息):當我希望用戶能夠從下拉框中選擇多個答案,將其保存在他們的個人資料中,然后讓其他用戶輸入時,我可以選擇考慮可用性和速度他們的searchcriteria(可以再次多次),最后通過那些多個searchcriteria查找用戶?
信息:目前我忙於將我的網站的一部分作為配對系統,就像約會網站一樣。
(我在我的網站上使用Mysqli,PHP和jQuery)
我使用約會網站作為一個例子來詳細說明我的問題:用戶A填寫他/她的個人資料並輸入他們對某個汽車品牌的偏好:寶馬,大眾和梅賽德斯。 用戶B想要在網站上搜索喜歡寶馬和/或梅賽德斯的會員。
我最初的想法是讓用戶A填寫輸入多個html字段並將其作為數組(或以逗號分隔)存儲在我的數據庫的一列中。 然后找出如何選擇 - 搜索通過該列存儲數組的用戶B。
因此,基本上用戶A可以在他們的個人資料中輸入多個汽車品牌,而用戶B可以給他們的標准也是多個汽車品牌; select查詢應該獲取匹配條件的任何行。
輸入字段多個看起來像:
<tr><td>Which car brand(s) do you like?</td><td>
<select multiple name="CarBrandPref[]">
<option value="BMW" > BMW</option>
<option value="Ford" > Ford</option>
<option value="Mercedes" > Mercedes </option>
<option value="GMC" > GMC</option>
<option value="Volkswagen" > Volkswagen </option>
<option value="Toyota" > Toyota </option>
<option value="Audi" > Audi </option>
</select>
</td></tr>
配置文件表布局類似於:
Id Name CarbrandPref
--------------------------------------------------------
1 Mike bmw,volkswagen,mercedes
2 Paul Mercedes, ford, GMC
3 Axel GMC, ford, toyota, audi
4 John ford, bmw
用戶B會給searchcriteria'bmw和mercedes'。 然后查詢應該返回3行:
Id Name CarbrandPref
---------------------------------------------------------
1 Mike bmw,volkswagen,mercedes
2 Paul Mercedes, ford, GMC
4 John ford, bmw
當我在SO和其他網站上搜索得到這個工作時,我注意到每個人都說這個(存儲在db中的數組中)對性能等有害等。此外我無法通過mysql中的數組進行select-search工作。
所以現在我不知所措。 我不想為每個可能的carbrand添加一列,但該怎么做? 有沒有人可以幫我這個? 任何想法都非常感謝!
我希望這足以讓有人幫助我。 如果不是,請告訴我,我將添加所需的信息。
我使用這些鏈接能夠將dropdownbox填充的數組存儲到mysql數據庫中:
你有三個選擇。
首先是沿着你的路徑前進並嘗試比較兩個逗號分隔的列表。 這會產生非常非常丑陋的SQL。 它不允許索引。 基本想法是這樣的:
where find_in_set(substring_index(@list, ',', 1), CarBrands) > 0 or
find_in_set(substring_index(substring_index(@list, ',', 2), ',', -1), CarBrands) > 0 or
. . .
第二個是引入一個新表,它有一行供用戶使用,最喜歡的是一行。 讓我們做一般,所以有一個用戶列,一個類別列(“CarBrand”)和一個名稱。 然后查詢看起來像:
from Profile p left outer join
Favorites f
on p.userId = f.userId and f.Category = 'CarBrand'
group by p.userId
having sum(f.Name = 'Mercedes') > 0 and
sum(f.Name = 'BMW') > 0;
第三種選擇是使用全文搜索和match
功能。 文檔在這里 。
我的猜測是全文索引可能是你做你想做的最簡單的方法。
編輯:
關於全文索引與選項2的查詢。可能關鍵問題與停用詞和短期術語有關。 例如,全文索引會刪除少於4個字符的單詞(默認情況下,您可以更改這兩個字符)。 它還有一個停用詞列表。
我個人傾向於使用第二種選擇。 但原因可能並不好。 它使用標准SQL,我對數據結構和查詢很滿意。 因此,它讓我可以更好地控制結果。
在您的情況下,全文搜索可能更容易快速實現,並且可能會更快或更快。 全文搜索還允許您執行更復雜的布爾值,例如混合“AND”和“OR”以及進行自然語言搜索以獲得相關性值。
您應該使用第三個表來映射用戶和汽車品牌。 該表將有一個主鍵,覆蓋兩列,每列都是另外兩個表之一的外鍵。 此表中存在一行映射“巴斯蒂安”和“寶馬”意味着他選擇了該品牌。 沒有這樣的行意味着不存在關聯。
更具體地,表1具有用戶,表2具有汽車品牌。 每個都有一個id為#的主鍵列。 第三個表鏈接這兩個。 請參閱MySQL中的多對多關系以及此處和此處
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.