0

クエリは次のとおりです。

    SELECT resume.user_id
    FROM ".$wpdb->prefix."wpjb_meta as meta
    JOIN ".$wpdb->prefix."wpjb_meta_value as value_von
    ON meta.id = value_von.meta_id AND meta.meta_object = 'resume' AND meta.name = 'arbeitsregion_von'
    JOIN ".$wpdb->prefix."wpjb_meta_value as value_bis
    ON meta.id = value_bis.meta_id AND meta.meta_object = 'resume' AND meta.name = 'arbeitsregion_bis'          
    JOIN ".$wpdb->prefix."wpjb_resume as resume
    ON value_bis.object_id = resume.id
WHERE value_von.value <= 222222 AND value_bis.value >= 222222

私の問題は 2 番目の結合です。同じテーブルを再度結合して、内容が「arbeitsregion_bis」の列を追加します。結果は次のようになります。

resume.user_id
-------4-------
-------6-------

ただし、クエリの結果は常にエントリがありません。なんで?

編集: 値は必要ありません。必要なのは WHERE 条件の値だけです。

4

1 に答える 1

2

あなたが行っている結合meta.nameでは、同時に 'arbeitsregion_von' と 'arbeitsregion_bis' という 2 つの値があると想定していますが、これは不可能です。

このクエリは、必要なものを提供するはずです (ただし、ユーザーごとに 2 行で)。

SELECT resume.user_id, meta.name as von_bis, my_values.value
FROM ".$wpdb->prefix."wpjb_meta as meta
JOIN ".$wpdb->prefix."wpjb_meta_value as my_values
ON meta.id = my_values.meta_id AND meta.meta_object = 'resume'
JOIN ".$wpdb->prefix."wpjb_resume as resume
ON my_values.object_id = resume.id
WHERE
meta.name IN ('arbeitsregion_von', 'arbeitsregion_bis')

1 つの列に表示するには、ピボットする必要があります。

SELECT resume.user_id, 
MAX(CASE WHEN meta.name = 'arbeitsregion_von' THEN my_values.value END) AS von,
MAX(CASE WHEN meta.name = 'arbeitsregion_bis' THEN my_values.value END) AS bis
FROM ".$wpdb->prefix."wpjb_meta as meta
JOIN ".$wpdb->prefix."wpjb_meta_value as my_values
ON meta.id = my_values.meta_id AND meta.meta_object = 'resume'
JOIN ".$wpdb->prefix."wpjb_resume as resume
ON my_values.object_id = resume.id
WHERE
meta.name IN ('arbeitsregion_von', 'arbeitsregion_bis')
GROUP BY resume.user_id

編集:あなたの新しい要件を満たすには、それが最も簡単です

SELECT resume.user_id, 
MAX(CASE WHEN meta.name = 'arbeitsregion_von' THEN my_values.value END) AS von,
MAX(CASE WHEN meta.name = 'arbeitsregion_bis' THEN my_values.value END) AS bis
FROM ".$wpdb->prefix."wpjb_meta as meta
JOIN ".$wpdb->prefix."wpjb_meta_value as my_values
ON meta.id = my_values.meta_id AND meta.meta_object = 'resume'
JOIN ".$wpdb->prefix."wpjb_resume as resume
ON my_values.object_id = resume.id
WHERE
meta.name IN ('arbeitsregion_von', 'arbeitsregion_bis')
GROUP BY resume.user_id
HAVING von <= 222222  AND bis >= 222222 
于 2013-09-17T08:51:18.713 に答える