2016-05-20 2 views
-1

Я новичок в веб-разработке, работая над первым школьным проектом. Я пытаюсь создать страницу активности, отображающую все последние действия пользователя в социальной сети. Мне нужно получить данные из разных таблиц, таких как posts, comments,, messages. Мне нужно заказать их по дате и использовать разбивку на страницы. Я думал, что могу использовать четыре разных оператора, а затем объединить результирующие массивы, но я не могу взять все эти данные, чтобы просто выбросить их из-за разбиения на страницы, поэтому мне нужны LIMIT и OFFSET заявления. SQL-оператор мне нужно что-то вроде этого:Закажите разные данные из разных таблиц в одном SQL-запросе

SELECT posts.stuff, comments.this, messages.that 
FROM posts, comments, messages 
ORDER BY ????? 
LIMIT 10 OFFSET 0 

Как заказать их по дате? Помогает ли это, если все таблицы имеют столбец с именем date?

Использование MySQL, PHP и Bootstrap для разбивки на страницы.

Спасибо: D

EDIT

Это таблица, которые я должен принимать данные:

[posts] 
idPosts 
title <-- 
description <-- 
date <-- 
`by` (FK) <-- 
category (FK) <-- 
"WHERE `by`= '$user_id'" 

[comments] 
idComments 
comment <-- 
date <-- 
post (FK) <-- 
`by` (FK) <-- 
"WHERE `by` = '$user_id'" 

[likes] 
idLikes 
date <-- 
post (FK) <-- 
`by` (FK) <-- 
"WHERE `by` = '$user_id'" 

[messages] 
idMessages 
message <-- 
date <-- 
`by` (FK) <-- 
`to` (FK) <-- 
"WHERE `by` = '$user_id' OR to = '$user_id'" 

this_is_a_foreign_key (FK) 
and 
i_need_this_column_out_of_the_query <-- 

Плюс, я должен знать, какие SELECT заявления определенной строка приходит из , поэтому я могу представить его соответствующим образом.

Возможно ли это так или иначе? Спасибо :)

Никто не знает, как получить такой результат? :/

+0

Так вы не заинтересованы в каких-либо отношений, которые могут существовать между этими таблицами – Strawberry

+0

@Strawberry, как вы говорите это? Я просто читаю записи на данный момент, мне это показалось правильным способом –

+0

Никто не знает, как получить такой результат? :/ –

ответ

1

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

Это будет выглядеть следующим образом:

SELECT action 
FROM (

    SELECT stuff AS action --I'll use action as the column name 
     , actionDate  --assuming that this is the column name of the date 
     FROM posts 

    UNION ALL    --because UNION only removes duplicate 

    SELECT this 
     , actionDate 
     FROM comments 

    UNION ALL 

    SELECT that 
     , actionDate 
     FROM messages 
) AS activities 
ORDER BY actionDate 
LIMIT 10     --no need for OFFSET if it is zero 
+0

Привет, спасибо за ответ :) Существует проблема: 'UNION ALL' требует, чтобы все операторы SELECT имели одинаковое количество столбцов, и, к сожалению, это не мое дело. Есть ли другой способ использовать «СОЮЗ»? Я продолжаю приходить с новыми идеями, но всегда должен их отбрасывать. XD ps: 'LIMIT' и' OFFSET' будут переменными –

+0

@OmarElHajj Да, 3 таблицы должны иметь одинаковое количество столбцов, потому что вы не можете «ЗАКАЗАТЬ» их, если вы не будет «СОЮЗ» им. В противном случае покажите нам дизайн трех таблиц и итоговую таблицу, которую вы пытаетесь достичь. – KaeL

+0

См. Отредактированный вопрос, спасибо: D –

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