2016-03-26 5 views
0

Я ищу способ выбора нескольких данных из нескольких таблиц WHERE uid = :uid и sort их data.несколько SELECT FROM multi tables and SORT по дате

некоторые вещи, как это:

SELECT * FROM 
    (SELECT * from comments) AND 
    (SELECT * from likes) AND 
    (SELECT * from photos) AND 
    (SELECT * from messages) WHERE uid = :uid ORDER BY date LIMIT 30 

На самом деле, в профильном сроки мне нужно показать likes, comments, photos и ... И все эти части должны быть sort by date с limitation ...

EDIT:

Select cid,comment,pid,date from `ctg_comments` where uid = 69 
UNION 
Select pid,date from `ctg_likes` where uid = 69 
UNION 
Select address,postid,date from `ctg_photos` where byuid = 69 
UNION 
Select postid,date from `ctg_reservation` where uid=69 
Order by date limit 30 

Мне нужно несколько столбцов таблицы, но они не одинаковы для использования UNION.

Спасибо.

+2

Что это? –

+0

В строке времени prfile мне нужно показать понравившиеся, комментарии, фотографии и ... И все эти части должны сортировать по дате с ограничением ... –

+0

вы можете использовать левое соединение в запросе MySQL. –

ответ

3
Select * from comments where uid=:uid 
UNION 
Select * from likes where uid:uid 
UNION 
Select * from photos where uid:uid 
UNION 
Select * from messages where uid:uid 
Order by date limit 30 

Это решение требует, чтобы столбцы из каждой таблицы имели один и тот же тип, в результате набора результатов имена столбцов первой таблицы. Если только один или два столбца отличается от каждой таблицы, вы можете просто извлечь подобные столбцы, называя их вместо извлечения всех столбцов: http://dev.mysql.com/doc/refman/5.7/en/union.html

Извлечение всех столбцов с *, как правило, не одобряли, потому что ваш код становится unreadble без знания базы данных. И он может извлечь больше данных, чем необходимо.

С вашей структуры данных, вы можете попробовать это (я угадал тип столбца, так это исправить, если это необходимо):

Select 'comment' as type, 'none' as address, cid, comment, pid, date from `ctg_comments` where uid = 69 
UNION 
Select 'like' as type, 'none' as address, -1 as cid, 'none' as comment, pid, date from `ctg_likes` where uid = 69 
UNION 
Select 'photo'as type, address, -1 as cid, postid as pid, 'none' as comment, date from `ctg_photos` where byuid = 69 
UNION 
Select 'reservation' as type, 'none' as address, -1 as cid, postid as pid, 'none' as comment, date from `ctg_reservation` where uid=69 
Order by date limit 30 

Я добавил колонку типа, так что легче иметь дело с PHP после (вы просто проверяете это поле с помощью случая коммутатора вместо проверки, если адрес == 'none' или cid == -1 ...).

+0

Спасибо @laurent, но UNION работает с одинаковыми столбцами: # 1222 - используемые операторы SELECT имеют различное количество столбцов –

+0

Вот почему вам нужно называть их вместо использования *, например, если все таблицы имеют дату, id, string1, string2, тогда ваш выбор будет: выберите дату, id, string1, string2 из ... –

+0

Если ваши таблицы полностью differents, то запрос на извлечение всего не будет иметь большого смысла, даже если это выполнимо, используя левое соединение и условное тестирование для каждого поля. Я настоятельно рекомендую извлечь все первые 30 строк из каждой таблицы, отсортированной по дате в разных наборах результатов, и обработать ее в php. –