2013-08-13 2 views
0
tableone: id | userid | date | photo | caption | visible 
tabletwo: id | userid | date | text | gender | notes 

У меня есть две таблицы с разными колонками. Я хочу выбрать строки из обоих, используя один запрос, я бы сделал это, используя дату (timestamp) и userid. Можно ли объединить их вместе?Выберите запрос для объединения двух таблиц?

SELECT id, photo, caption, visible 
FROM `tableone` 
WHERE `userid` = $user->id AND `date` = '$d' 
ORDER BY date desc 

SELECT id, text, gender, notes 
FROM `tabletwo` 
WHERE `userid` = $user->id AND `date` = '$d' 
ORDER BY date desc 
LIMIT 1 

EDIT: Желаемый результат:

(
    [id] => 3 
    [photo] => 1 
    [caption] => Sample text 
    [visible] => 1 
    [text] => 
    [gender] => 
    [notes] => 
) 
(
    [id] => 23 
    [photo] => 1 
    [caption] => More sample text 
    [visible] => 
    [text] => 
    [gender] => 
    [notes] => 
) 
(
    [id] => 1 
    [photo] => 
    [caption] => 
    [visible] => 
    [text] => Blah jaspidj 
    [gender] => 2 
    [notes] => Sample Text 
) 
+2

Этот вопрос, кажется, задают почти каждый день. –

+2

Посмотрите ключевое слово SQL JOIN. –

+0

Я не хочу присоединиться к колонкам вместе. Я хочу объединить две таблицы, но держать строки раздельными. – ditto

ответ

2

Концепция, которую вы ищете, это UNION (см. MySql UNION reference), которая объединяет результаты двух запросов вместе. Обычно вы получаете только результаты объединения, имеющие одинаковые столбцы, однако вы запрашиваете объединение двух разных типов запросов. Если все, что вы заботитесь о видит все результаты вместе, и вы не заботитесь о том, пустые ячейки, то это должно работать для вас:

(SELECT id, photo, caption, visible, null AS text, null AS gender, null AS notes 
FROM `tableone` 
WHERE `userid` = $user->id AND `date` = '$d' 
ORDER BY date desc) 
UNION ALL 
(SELECT id, null AS photo, null AS caption, null AS visible, text, gender, notes 
FROM `tabletwo` 
WHERE `userid` = $user->id AND `date` = '$d' 
ORDER BY date desc 
LIMIT 1) 

(Обратите внимание, что я использовал UNION ALL вместо UNION, который в основном означает " дать мне все результаты, в том числе дублей». Так как не может быть дубликатами в этом наборе, можно безопасно использовать UNION ALL, чтобы получить прирост производительности)

выходной сигнал этого логически не имеет смысла, но она должна дать вам пример вывода, который вы показали выше.

+0

В этом случае вы хотели бы использовать UNION ALL, который быстрее, поскольку оба оператора являются взаимоисключающими. – HLGEM

+0

@HLGEM Да, спасибо. – ean5533

+0

Спасибо, это сработало. Есть ли в любом случае, чтобы LIMIT 1 применим только к планшетному ПК? Мне пришлось удалить его, потому что он ограничивал весь запрос до 1. – ditto

2

Таким образом, вы можете получить и данные строк таблиц, имеющий идентификатор пользователя и дату, как пары? ИТАК придется использовать JOIN, чтобы получить их все в одной строке

SELECT t1.id, t1.userid, t1.date, t1.photo, t1.caption, t1.visible, t2.text, t2.gender, t2.notes 
FROM tableone t1 JOIN tableone t2 ON t1.ID = t2.ID 
WHERE t1.userid = "yourwantedid" AND t1.date = "yourwanteddate" 

Вы можете использовать только таблицу 1 в ИНЕКЕ, поскольку вы будете объединять обе таблицы в одном.

Извините за мой плохой английский. Надеюсь, что эта помощь

Недавно я вижу свой комментарий, может быть, вы хотите использовать UNION ALL пункт

SELECT t1.id, t1.userid, t1.date, t1.photo, t1.caption, t1.visible 
FROM tableone t1 
WHERE userid = "yourwantedid" AND date = "yourwanteddate" 
UNION ALL 
SELECT t2.id, t2.userid, t2.date, t2.text as photo, t2.gender as caption, t2.notes as visible 
FROM tabletwo t2 
WHERE userid = "yourwantedid" AND date = "yourwanteddate" 

вы должны поставить псевдоним на колоннах, чтобы использовать UNION ALL пункт, который совпадает столбцы имена обоих вариантов.

Извините за мой плохой английский. Надеюсь, эта помощь

+0

У вас есть несколько ошибок в вашем примере UNION ALL. Вы используете псевдоним 't1', хотя он не был определен, вы ссылаетесь на столбцы, которые не существуют в' tableone', и вы выбираете из 'tableone' дважды. – ean5533

+0

Вы были правы, я редактирую свое решение из-за его недавнего комментария, и я сделал это worng. Теперь я редактирую его. Благодаря!! – GianlucaBobbio

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