2016-05-10 2 views
1

これはWordpressのWebサイトに関するものです。sqlクエリは、結合されたテーブルの多くのうち1つの値を取得します

2つのテーブルがあります。 1はwp_usersと呼ばれ、1はwp_usermetaと呼ばれます。
2つのテーブルはwp_users.id = wp_usermeta.user_idによってリンクされています。
Usermetaには、meta_keymeta_valueという名前の列があります。 1ユーザーに複数のmeta_keyがありますが、それぞれmeta_keyにはmeta_valueもあります。私が持っていると思い何

は私がmeta_key = 'foobarの' wp_usermetaからwp_usersmeta_valueからIDuser_login & user_emailを選択したいのですが、以下のよう

です。ただし、クエリを使用する場合は、検索した文字列がuser_loginuser_emailまたはmeta_valueに含まれている場合に限り、検索を使用すると同じ検索が行われるようにする必要があります。

ここに私が現在持っているものがあります。私はテーブルに加わることを試みましたが、これを正確に行う方法はかなりわかりません。私はむしろ労働組合を使用します

public function get_users($get_from, $per_page, $search = null) { 
    global $wpdb; 
    $sql =  "SELECT ID, user_login username, user_email FROM {$wpdb->prefix}users"; 

    if(isset($search)) { 
     $sql .= " WHERE user_login LIKE '%" . esc_sql($wpdb->esc_like($search)) . "%'"; 
     $sql .= " OR user_email LIKE '%" . esc_sql($wpdb->esc_like($search)) . "%'"; 
    } 

    if(!empty($_REQUEST['orderby'])){ 
     $sql .= " ORDER BY " . esc_sql($_REQUEST['orderby']); 
     $sql .= !empty($_REQUEST['order']) ? ' ' . esc_sql($_REQUEST['order']) : ' ASC'; 
    } 

    $sql .= " LIMIT $get_from , $per_page"; 
    echo $sql; 

    $result = $wpdb-> get_results($sql, 'ARRAY_A'); 
    $this->total_users = $wpdb->num_rows; 

    return $result; 
} 
+0

'' wp_postmeta'のように動作しますwp_usermeta'。そのテーブルを照会するために、SOまたは他の場所でアドバイスを探してみてください。 –

答えて

0

、それは一連のか、条件よりも私の経験では高速です。

SELECT ID, user_login username, user_email 
FROM users 
WHERE user_login LIKE '%...%' 
UNION DISTINCT 
SELECT ID, user_login username, user_email 
FROM users 
WHERE user_email LIKE '%...%' 
UNION DISTINCT 
SELECT ID, user_login username, user_email 
FROM users 
INNER JOIN wp_usermeta ON users.id=wp_usermeta.user_id 
WHERE wp_usermeta.meta_key='foobar' and wp_usermeta.meta_value LIKE '%...%' 

代わりに、連結文字列に一つになどに3つのフィールドを連結することができます

SELECT ID, user_login username, user_email 
FROM users 
LEFT JOIN wp_usermeta ON users.id=wp_usermeta.user_id 
AND wp_usermeta.meta_key='foobar' 
WHERE concat_ws(',',user_login, user_email, coalesce(wp_usermeta.meta_value,'') LIKE '%...%' 
+0

共用体の例では、メタ値をフェッチしていないため、検索にのみ使用しています。これはID、user_login、およびuser_emailだけが必要な場合には機能しますが、meta_valueも必要です。 concatオプションに関して、それは私に限界のエラーを与えていますか?私はまだアクティブではなかったもの(純粋にコピーされた名前とわずかに編集された名前、そしてphpmyadminに貼り付けられたもの) – Evergetic

+0

1)あなたは、ユニオンのすべてのクエリにメタテーブルを参加させることができます。 **あなたの**クエリを出発点として使用しました。 2)あなたの質問がエラーを返すか、それともそれを述べているか私に尋ねていますか?あなたがそれを述べているなら、plsは正確なエラーメッセージと実行しようとした正確なクエリを提供します。 – Shadow

+0

1)Oh ofc。私はそれを試してみよう! 2)私は、申し立てを述べていた。 '#1064 - SQL構文に誤りがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックし、正しい構文を 'LIMIT 0、30' at line 6'の近くで使用してください。ただし、クエリは5行であり、制限はありません。 – Evergetic

関連する問題