2013-09-17 7 views
0

Запросов это один:Selfjoin в 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------- 

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

EDIT: Мне не нужны значения, мне нужны только те, в условиях WHERE, sry.

+0

вам нужно использовать 'LEFT JOIN' вместо неявного соединения, которое на самом деле является' INNER JOIN' – Stephan

+0

Hm, no thats not working (0 записей) – user1711384

ответ

2

С соединением, которое вы делаете, вы предполагаете, что 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 

EDIT: Для удовлетворения новых требований, было бы проще всего сделать

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 
+0

Я просто задаю свой вопрос – user1711384

+0

отлично, это работает! Как изменить запрос с новыми условиями? – user1711384

+0

@ user1711384 Обновлен мой ответ. – fancyPants

Смежные вопросы