2013-02-16 2 views
1

Я пытаюсь запустить запрос в таблице (тот, который использует Wordpress), где я хочу выбрать столбцы ID и post_type из одной таблицы, а затем сделать Left Join в другую таблицу, два отдельных раза (получение отдельных данных) ,Присоединиться к выбору SQL-запроса?

Это то, что я до сих пор, но это не отрезания горчица:

SELECT derby_posts.id  AS pID, 
     derby_posts.post_type AS tier 
FROM derby_posts 
     LEFT JOIN (SELECT derby_postmeta.post_id AS dbID1, 
         derby_postmeta.meta_key AS dbMeta1) 
       ON pid = dbid1 
       AND dbmeta1 = 'twitter' 
     LEFT JOIN (SELECT derby_postmeta.post_id AS dbID2, 
         derby_postmeta.meta_key AS dbMeta2) 
       ON pid = dbid2 
       AND dbmeta2 = 'website' 
WHERE tier IN ('local', 'regional', 'national') 

Я уверен, что я что-то супер просто не хватает ...

Edit: вот решение, работал на меня. Помощник таблицы помог, все мои инструкции SELECT очистили все. Кроме того, я понял, что могу удалить элементы из SELECT, хотя я использую их в Join, что очень сильно очищает результаты.

SELECT 
    db.ID as id, 
    db.post_type as tier, 
    dpm1.meta_value as twitter, 
    dpm2.meta_value as website 
FROM derby_posts db 
LEFT JOIN derby_postmeta dpm1 ON (db.ID = dpm1.post_id AND dpm1.meta_key = 'twitter') 
LEFT JOIN derby_postmeta dpm2 ON (db.ID = dpm2.post_id AND dpm2.meta_key = 'website') 
WHERE db.post_type IN ('local','regional','national') 
+1

Я отредактировал ваш вопрос для форматирования и изменил ваш фильтр, чтобы использовать 'IN' вместо нескольких операторов' OR'. – Kermit

+0

«это не работает» не является сообщением об ошибке. Как не работает? Возвращает ли он 0 строк, возвращает ли он неправильные результаты, показывает ли ошибка? –

ответ

2

Я уверен, что я что-то супер просто не хватает ...

Вы правы!

Вы должны указать свой псевдоним и использовать его в пункте ON. Вы также отсутствуете FROM <table> - обязательная часть SELECT заявления, который читает из таблицы:

LEFT JOIN (
    SELECT derby_postmeta.post_id AS dbID1, 
      derby_postmeta.meta_key AS dbMeta1 
    FROM someTable 
) dpm ON pid = dpm.dbid1 AND dpm.dbmeta1 = 'twitter' 

Я дал результаты вашего SELECT псевдонима dpm, и использовали его, чтобы «связать» строку из внутренний выберите строки внешнего выбора.

+0

Хм ... когда я это делаю, он не распознает псевдонимы для исходной таблицы (см. Отредактированный вопрос). –

+0

@BenjaminAllison В зависимости от вашей РСУБД, возможно, вам придется указать исходную таблицу как псевдоним. – dasblinkenlight

+0

Я добавил псевдоним, но все равно получаю ту же ошибку. Добавлено редактирование (fwiw, это MYSQL на MAMP). –

1
SELECT 
    db.derby_posts.ID as pID, 
    db.derby_posts.post_type as tier, 
    dpm1.post_id as dbID1, 
    dpm1.meta_key as dbMeta1, 
    dpm2.post_id as dbID2, 
    dpm2.meta_key as dbMeta2 
FROM derby_posts db 
LEFT JOIN derby_postmeta dpm1 ON (db.pID = dpm1.post_id AND dpm1.meta_key= 'twitter') 
LEFT JOIN derby_postmeta dpm2 ON (db.pID = dbm2.post_id AND dbm2.meta_key = 'website') 
WHERE tier IN ('local','regional','national') 
+0

Я бы написал это так, так как его легче читать. – Leeish

+0

Спасибо за вашу помощь, но это действительно запутывает ... откуда пришли dpm1 и dpm2? Две таблицы, к которым я присоединяюсь, - derby_posts и derby_postmeta, и оба они являются частью одной и той же базы данных. Кроме того, derby_postmeta - это одна таблица, которую я пытаюсь объединить дважды. –

+0

'LEFT JOIN derby_postmeta dpm1' Объединение derby_postmeta в виде таблицы с именем dpm1. Таким образом, вы можете поместить все свои избранные в одном месте и обратиться к правильным таблицам. Поэтому, если вы присоединитесь к ним, я обычно называю один «table1» и другой «table2», тогда я все еще могу вызвать все в своем основном операторе select и посмотреть, какие таблицы я извлекаю из каких полей. Вместо того, чтобы копаться в моих соединениях. – Leeish

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