2015-02-09 2 views
2

Я делаю кормовую стену, а две службы сохраняют сообщения в одной таблице базы данных.Комбинат 2 MySQL выбирает утверждения как с использованием LIMIT

Одна служба проводки используется намного больше, чем другая, поэтому на стене я хочу ограничить каждую службу 25 новыми сообщениями (всего 50) на первой странице для равного представления.

Это то, что я изначально был, без вечера посты:

$sql = "SELECT * FROM posts"; 
$sql .= " WHERE disq = 0"; 
$sql .= " AND approved = 1"; 
$sql .= " ORDER BY created_at DESC"; 
$sql .= " LIMIT 50"; 

но я стараюсь, чтобы ограничить их службы:

$sql_1 = "SELECT * FROM posts"; 
$sql_1 .= " WHERE disq = 0"; 
$sql_1 .= " AND approved = 1"; 
$sql_1 .= " AND source = 'TW'"; 
$sql_1 .= " ORDER BY created_at DESC"; 
$sql_1 .= " LIMIT 25"; 

$sql_2 = "SELECT * FROM posts"; 
$sql_2 .= " WHERE disq = 0"; 
$sql_2 .= " AND approved = 1"; 
$sql_2 .= " AND source = 'IG'"; 
$sql_2 .= " ORDER BY created_at DESC"; 
$sql_2 .= " LIMIT 25"; 

Doing что-то вроде

$sql = $sql_1 UNION $sql_2; 

Кажется, не работает, потому что все примеры, которые я вижу, выполняют LIMIT в конце кучки запросов. После этого должен быть выполнен ORDER BY, чтобы хронологически переупорядочить столбы и сделать смешанную службу на стене.

MySQL помощь оценена

+0

Вы можете использовать временную таблицу для хранения результатов. Таким образом вам даже не понадобится _UNION_. –

+0

Обновления с новыми сообщениями каждые несколько минут, поэтому я не уверен, что лучше, используя объединение или таблицу. Не действительно используется для запросов mysql, более сложных, чем выбор, обновление и т. Д. – Kiwizoom

+0

Временные действительно быстрые, потому что они в памяти. И они существуют только для продолжительности транзакции. –

ответ

1

Вы можете опустить свой заказ в ваших подзапросов и просто сделать это в конце концов, после объединения.

(
SELECT * FROM POSTS 
WHERE disq = 0 AND approved = 1 AND source= 'TW' 
LIMIT 25 
) 
UNION ALL 
(
SELECT * FROM POSTS 
WHERE disq = 0 AND approved = 1 AND source= 'IG' 
LIMIT 25 
) 
ORDER BY created_at DESC 

Более подробная информация о профсоюзе и как сортировать объясняются в this MySQL documentation

+1

OP хотел 25 из каждого, я думаю. И, конечно, 'UNION ALL' для скорости, если не будет никаких дубликатов для удаления. –

+0

Ах да, спасибо, забыли об этом. Добавлено его в примере. Для Kiwizoom: UNION пытается удалить дубликаты из результата, поэтому он немного медленнее. Чек также здесь: http://stackoverflow.com/questions/49925/what-is-the-difference-between-union-and-union-all –

+0

О, спасибо. Кажется, это работает. Наверное, я не знал синтаксиса, как писать этот союз. Полезный вопрос о UNION ALL полезен – Kiwizoom

1

Вы должны тянуть последние 25 пунктов отдельно от двух критериев наборов, а затем положить их вместе и порядок их снова.

Это будет похоже на это. Вам нужны эти вложенные подзапросы, потому что предложения ORDER BY ... LIMIT необходимо связать с каждым отдельно.

SELECT * 
    FROM 
     (SELECT * 
      FROM POSTS 
      WHERE disq = 1 AND approved = 1 AND source= 'TW' 
      ORDER BY created_at DESC 
      LIMIT 25 
     ) A 
UNION ALL 
     (SELECT * 
      FROM POSTS 
      WHERE disq = 1 AND approved = 1 AND source= 'IG' 
      ORDER BY created_at DESC 
      LIMIT 25 
     ) A 
ORDER BY created_at DESC, source 

Индекс на вашем столе ДОЛЖНОСТИ на (disq, approved, source, created_at) будет служить для ускорения этого запроса.

+0

Ваш ответ хотя бы получит 25 новых сообщений, которые OP явно просит , –

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