簡體   English   中英

html選擇多項選擇輸入,將它們存儲在mysql db中並搜索匹配項

[英]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數據庫中:

http://www.aleixcortadellas.com/main/2009/03/20/492/

http://toolspot.org/how-to-store-array-mysql.php

你有三個選擇。

首先是沿着你的路徑前進並嘗試比較兩個逗號分隔的列表。 這會產生非常非常丑陋的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM