私は、クライアントのサイトのユーザーが、主に結婚のために名前を変更した可能性がある人を知っている人を検索できる、かなり大きなプロジェクトに取り組んでいます。基本的に、ユーザーはこれまでに使用したすべての名前でサインアップし、データはMySQLデータベースに入力されます。次のステップは実際に検索を作成することです。これにより、ユーザーは覚えている名前を入力することができます。
これはデータベースへの登録例です:
username first0 first1 first2 first3 first4
(email) Lisa John Frank Sam Smith
現在、私のクエリは次のようになります。
SELECT * FROM NAMES
WHERE (
`names`.`first0` IN ("Lisa", "Sam", "")
AND `names`.`first1` IN ("Lisa", "Sam", "")
AND `names`.`first2` IN ("Lisa", "Sam", "")
AND `names`.`first3` IN ("Lisa", "Sam", "")
AND `names`.`first4` IN ("Lisa", "Sam", "")
**検索フォームに入力したデータを正確な名前に置き換えます。
Frank
リストに含まれていないfirst2 =のため、このクエリは機能しません。人が誰かがデータベースに入力したすべての名前を知らない場合、すべてが壊れます。
ただし、Lisa
誰かがLisa
名前の1つだけを入力した場合に、名前が一致するすべての結果が返されるようにしたくないので、ORステートメントを使用したくないと思います。
誰か私がこれをどうやってやるのか知っていますか?
ここで不必要に拘束されています。代わりに検討してください:
User
UserId, OtherData
UserNames
UserId, Name, Kind
次のようなデータ:
UserId, OtherData
1, Blahblah
UserId, Name, Type
1, Lisa, First
1, Jane, Middle
1, Smith, Last
1, Leese, First
1, Jones, Last
リースとしても知られるリサジェーンスミスは結婚し、名前をリサジェーンジョーンズに変更しました
「任意の数の名前を入力し、その種類を示す」というWebサイトのユーザーを提示する場合は、名前の種類がすべて記載されているユーザーIDを見つけるクエリを実行できます。
これは、動的に参加する、または条件付き集計を行うなど、単純な場合があります
たとえば、Webユーザーが姓として「Leese」を入力し、姓として「Jones」を入力した場合、次のことができます。
SELECT UserID FROM UserNames
WHERE
(name = 'Leese' AND type = 'First') OR
(name = 'Jones' AND type = 'Last')
GROUP BY
UserID
HAVING count(*) = 2 --2 is the number of names entered, leese and jones. If your where clause had 5 names, this would be 5
または、結合アプローチを使用することもできます(これは、Webユーザーが3つの名前/種類を入力した場合)。
SELECT u1.UserID
FROM
UserNames u1
INNER JOIN Usernames u2 ON u1.UserID = u2.UserID
INNER JOIN Usernames u3 ON u1.UserID = u3.UserID
WHERE
u1.name = 'Leese' AND u1.type = 'First' AND
u2.name = 'Jones' AND u2.type = 'Last' AND
u3.name = 'Smith' AND u3.type = 'Last' AND
動的クエリを作成するときは、値をSQLに連結しないでください。クエリを動的に作成しているからといって、ウィンドウからパラメータ化をスローする言い訳にはなりません。SQLストリングとパラメータープレースホルダーを連結してSQLを作成し、パラメーター値を個別に指定します。
文字列を{プレースホルダー}で補間する言語の疑似コード(phpは知りません):
string fromclause = ""
string whereclause = ""
for i = 0 to webrequest.form.values.length - 1
string name = webrequest.form.values[i].name
string type = webrequest.form.values[i].type
if i == 0 then
fromclause = fromclause + "Usernames u{i}"
else
fromclause = fromclause + " INNER JOIN Usernames u{i} ON u1.UserID = u{i}.UserID
whereclause = whereclause + " u{i}.Name = @paramName{i} AND u{i}.type = @paramType{i}"
sqlcommand.parameters.add("@paramName{i}", name)
sqlcommand.parameters.add("@paramType{i}", type)
next i
sqlcommand.commandtext = "SELECT UserID FROM {fromclause} WHERE {whereclause}"
最後に、すべてパラメーター化されたsqlコマンドを使用します。パラメーターはすべて指定された値です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加