1

私は WordPress を使用していますが、この質問は関連する SQL に関連しています。必要があれば喜んで動かします。

私はhttp://www.libertyguide.com/jobsに取り組んでおり、フィルタリングの仕組みを変更しようとしています。現在、それはグローバルORクエリです。

とにかく、私は 3 つのフィルタリング リストを持っており、次の方法で、選択したものを 3 つの文字列 (興味、タイプ、経験) に格納しています。

"( $wpdb->terms.slug = 'webdevelopment' OR $wpdb->terms.slug = 'journalism' OR ... ) AND"

フィルタリング リストで選択されたものによって入力されます。

結局のところ、私はこれを基本的なクエリとして持っています(私は省略していますLEFT JOINS):

前:

SELECT * FROM $wpdb->posts WHERE ($wpdb->terms.slug = 'fromlist1' 
OR $wpdb->terms.slug = 'fromlist2' OR $wpdb->terms.slug = 'fromlist3') 
AND $wpdb->term_taxonomy.taxonomy = 'jobtype'...

後:

SELECT * FROM $wpdb->posts WHERE 
($wpdb->terms.slug = 'fromlist1' OR $wpdb->terms.slug = 'fromlist1again') 
AND ($wpdb->terms.slug = 'fromlist2' OR $wpdb->terms.slug = 'fromlist2again') 
AND ($wpdb->terms.slug = 'fromlist3' OR $wpdb->terms.slug = 'fromlist3again') 
AND $wpdb->term_taxonomy.taxonomy = 'jobtype'...

だから本質的に私はから行きたいです

ORフィルター

ANDフィルタリングを間に挟んだフィルターOR

私の新しいフィルタリングは、1 つの項目全体が選択された場合にのみ機能しますが、複数の項目を選択した場合は何も返されません (いくつかの投稿と一致することがわかっています)。

ロジックを考えてみましたが、何も問題はありません。他に何も問題がないことはわかっているので、クエリ自体である必要があります。

正しい方向への一歩は大歓迎です。ありがとう!

更新 混乱から、基本的に私はこれを持っています:

"SELECT ...... WHERE $terms ..." 

でも私はしたい

"SELECT ....... WHERE $interests AND $type AND $experience"

フィルターをかけたくない$interest[1] OR $interest[2] OR $type[1] OR $experience[1]が、代わりにフィルターをかけたい($interest[1] OR $interest[2]) AND ($type[1]) AND ($experience[1])

これがより理にかなっていることを願っています

*更新 2 *

ここに例があります:

私の関心リストでは、たとえば、Web 開発、学問、ジャーナリズムの 3 つを選択します。

私のタイプ リストでは、フルタイム、パートタイムの 2 つを選択します。

私の経験リストでは、Earlycareer、Midcareer、Latecareer の 3 つを選択します。

クエリを実行するとき、各レコードに 3 つのリストのそれぞれが少なくとも 1 つ含まれていることを確認したいと考えています。考えられる結果: (Web 開発、パートタイム、中途採用)、(アカデミア、フルタイム、アーリーキャリア、中途採用)。

結果ではない: (ジャーナリズム、初期のキャリア) - フルタイムまたはパートタイムを欠席

これでもっとすっきりすることを願っています。これを正しく機能させることができれば、喜んで補償します。

4

3 に答える 3

2

さて、私はこれを撃ちます:

SELECT * FROM $wpdb->posts WHERE
(
$wpdb->terms.slug IN ('$interest1', '$interest2') AND 
$wpdb->terms.slug IN ('$type1', '$type2') AND 
$wpdb->terms.slug IN ('$exp1', '$exp2')
)
AND $wpdb->term_taxonomy.taxonomy = 'jobtype'

セットのINいずれかのメンバーが一致する場合、キーワードは true を返します。

于 2012-04-25T17:48:58.473 に答える
1

WHERE category IN (comma, seperated, list, of, values)フォームから動的に生成できるものを探していると思います。他のカテゴリと組み合わせると、それぞれから何かを選択するように要求できます...

 WHERE category1 IN (a, comma, seperated, list, of, values)
 AND   category2 IN (another, list, of, values)
 AND ...

これは、各カテゴリから選択されたものがある場合にのみ値を返し、選択リストのいずれかが空の場合は何も返しません。実際にはエラーが発生する可能性があるため、特定のカテゴリにコンテンツがある場合は、クエリを動的に生成します。

if (!empty($arrayOfCategory1)) {  
    //sanitize input logic here  
    $Category[1] = 'category1 IN ('. implode(', ', $arrayOfCategory1) .')';  
} else {  
    $Category[1] = '';  
}  

結果の文字列を連結し、それを使用してクエリを作成します。WHERE 1=1何も選択しないとデータベース内のすべてが一致するため、このトリックには問題があります。そのため、AND演算子を適切に追加するプロセスを実行することを強くお勧めします。

編集:条件ステートメントを配列として作成すると、それらをで内包' AND 'し、かなり少数のコード行でクエリを取得できることに気付きました。

于 2012-04-25T18:02:29.217 に答える
0

あなたの言っていることに少し混乱していますが、フィルターを作成したい場合は、送信されたフィルター値に基づいて SQL クエリを動的に生成します。何かのようなもの:

$sql = "SELECT * FROM $wpdb->posts WHERE 1=1";
if ( !empty($interest) ) { // they ticked the interested in ??? checkbox
    $sql .= " AND $wpdb->terms.slug = $interest"
}

明らかに、送信された値をフィルタリングしてエスケープする必要があります。

于 2012-04-25T16:58:42.997 に答える