Self-соединение в SQL не работает

Запрос вот этот:

    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

Моя проблема заключается во втором соединении: он снова присоединяется к той же таблице, чтобы добавить столбец с содержимым "arbeitsregion_bis". Результат должен быть примерно таким:

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

Но в результате запроса всегда нет записи. Зачем?

РЕДАКТИРОВАТЬ: мне не нужны значения, мне нужны только те, в условиях, где, сэр.

1 ответ

Решение

С объединением, которое вы делаете, вы предполагаете, что meta.name имеет два значения одновременно, arbeitsregion_von и arbeitsregion_bis, что невозможно.

Этот запрос должен дать вам то, что вы хотите (хотя в двух строках на пользователя).

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')

Чтобы это было в одном столбце, вам нужно повернуть:

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 
Другие вопросы по тегам