2011-06-27 7 views
1

私はdb内のユーザーを検索するスクリプトを持っています。私は2つの入力フィールドを持っています。都市と家の番号。私が欲しいのは、もし私が都市部のロンドンと20番のロンドンで記録を返し、20を記録します。私はこれをどのように達成するかについてはあまりよく分かりません。私はGoogleに関する十分な調査を行ったが、依然として答えを見つけられなかった。ここで2つのクエリからどのように結果を得ることができますか

は私のコードです:

if($_GET['search'] != ''){ 
$result = mysql_query("SELECT * FROM klant WHERE klant_id LIKE '%" .$search."%' OR    voornaam LIKE '%" .$search."%' OR achternaam LIKE '%" .$search."%' OR email LIKE '%"  .$search."%' OR plaats LIKE '%" .$search."%' OR bedrijfsnaam LIKE '%" .$search."%'ORDER BY  klant_id DESC"); 


$result2 = mysql_query("SELECT * FROM klant WHERE klant_id LIKE '%" .$search2."%' OR voornaam LIKE '%" .$search2."%' OR achternaam LIKE '%" .$search2."%' OR email LIKE '%" .$search2."%' OR plaats LIKE '%" .$search2."%' OR bedrijfsnaam LIKE '%" .$search2."%'ORDER BY klant_id DESC"); 
$i = 0; 

} 

私は必要なもの、これらの2つの検索値($検索と$ search2)が組み合わされて、適切$結果を与えるものです。したがって、私はもっと簡単に検索することができます。

あなたが私を理解するのに十分なだけの質問をしてくれたらと願っています。私を助けてくれることを願っています!

+0

あなたはすべてのフィールドでの入力値と一致する必要がありますか? – joakimdahlstrom

+0

結果から1つのレコードだけが必要ですか? – NullRef

答えて

1

次のロジックを試してみてください -

if($_GET['search'] != ''){ 
$search = $_GET['search']; 
$where[] = "(klant_id LIKE '%" .$search."%' OR voornaam LIKE '%" .$search."%' OR achternaam LIKE '%" .$search."%' OR email LIKE '%"  .$search."%' OR plaats LIKE '%" .$search."%' OR bedrijfsnaam LIKE '%" .$search."%') "; 
} 
if($_GET['search2'] != ''){ 
$search2 = $_GET['search2']; 
$where[] = " (klant_id LIKE '%" .$search2."%' OR voornaam LIKE '%" .$search2."%' OR achternaam LIKE '%" .$search2."%' OR email LIKE '%" .$search2."%' OR plaats LIKE '%" .$search2."%' OR bedrijfsnaam LIKE '%" .$search2."%') "; 
} 
$query_where = (is_array($where))?" WHERE ".implode(" AND ", $where):""; 
$result = mysql_query("SELECT * FROM klant ".$query_where." ORDER BY klant_id DESC"); 
+0

$ result = mysql_query( "SELECT * FROM klant"。$ query_where。 "ORDER BY klant_id DESC"); mysql引数が有効ではないというエラーを返します。何が間違っていますか? – Andre

+0

申し訳ありませんが、最初のブレースが1つありませんでした - if($ _GET ['search2']!= ''){ $ search2 = $ _GET ['search2']; $ where [] = "( – mahadeb

+0

ありがとうございました! – Andre

2

さてあなたは、2つのクエリを実行すると1つの結果がセットされます場合は、UNIONクエリで

0

を探している必要があります。たとえば、UNION句 使用することができます.. UNION 2番目のクエリ最初のクエリを.. :)

0

私はあなたがカッコで別のOR演算子を使用することができます信じる:

$result = mysql_query(" 
    SELECT 
     * 
    FROM 
     klant 
    WHERE 
     (klant_id LIKE '%" .$search."%' OR 
     voornaam LIKE '%" .$search."%' OR 
     achternaam LIKE '%" .$search."%' OR 
     email LIKE '%".$search."%' OR 
     plaats LIKE '%" .$search."%' OR 
     bedrijfsnaam LIKE '%" .$search."%') 
    OR 
     (klant_id LIKE '%" .$search2."%' OR 
     voornaam LIKE '%" .$search2."%' OR 
     achternaam LIKE '%" .$search2."%' OR 
     email LIKE '%" .$search2."%' OR 
     plaats LIKE '%" .$search2."%' OR 
     bedrijfsnaam LIKE '%" .$search2."%') 
    GROUP BY 
     klant_id 
    ORDER BY 
     klant_id DESC"); 

しかし、UNIONは、他の答えが示唆するように、よりきれいに見えるかもしれません。

同じ結果が複数回表示されないようにグループを追加しました。あなたの2つのクエリの間

+0

連合とORはうまくいかず、私はまだ良い結果を得られません。たぶん私は言いたいことがあります:私はロンドンの街を得てそこに3つのハウスナンバーを持っていて、ロンドンと20を探しています。もちろん、私はより多くの '都市'を持っているので、番号20の他の都市も許可されていません – Andre

+0

次にgroup by節を追加して、結果1件につき1つのエントリを作成することができます – Nightwolf

+0

Nightwolfのクエリで、 AND'。 –

0
if($_GET['search'] != ''){ 

$query1 = "SELECT * FROM klant WHERE klant_id LIKE '%" .$search."%' OR voornaam LIKE '%" .$search."%' OR achternaam LIKE '%" .$search."%' OR email LIKE '%".$search."%' OR plaats LIKE '%" .$search."%' OR bedrijfsnaam LIKE '%" .$search."%'ORDER BY klant_id DESC"; 

$query2 = "SELECT * FROM klant WHERE klant_id LIKE '%" .$search2."%' OR voornaam LIKE '%" .$search2."%' OR achternaam LIKE '%" .$search2."%' OR email LIKE '%" .$search2."%' OR plaats LIKE '%" .$search2."%' OR bedrijfsnaam LIKE '%" .$search2."%'ORDER BY klant_id DESC"; 

$result = mysql_query($query1 . ' UNION ALL ' . $query2; 
$i = 0; 

} 
1

言葉(のみ個別の値のために)「UNION」や「UNION ALLは、」(繰り返しを可能にするために)1つの結果テーブルにそれらを結合します。

しかし、検索に関しては、%word%の使用を強くお勧めします。 SQLが問題の単語を含むものを見つけるために文字列全体の長さを反復するので、大量のデータを取得すると、検索が大幅に遅くなります。

+0

あなたの提案は何ですか? – Andre

+2

彼は非常に有効なポイントを知っているに過ぎません。 '%blah%'を使用すると、インデックスが使用されないことを意味します。クエリはフルテーブルスキャンを行います。あなたが100万のレコードを持っているならば、すべてのレコードを調べます。 パフォーマンスヒットの価値があるかどうかを判断する必要があります。 – mikeq

+1

あなたの例では、最初の%を削除しても問題はないようです。たとえば、20番の家に20番を入力した場合、「20」と入力すると、「120」「4120」と「1520141」が表示されますか?最初のワイルドカードを削除すると、データベースのスケーラビリティが大幅に向上します。 – carlbenson

関連する問題