2012-06-19 3 views
0

У меня есть таблица с проектами в них:Объединение два ВЫБИРАЕТ из одной таблицы

  • идентификаторы (INT)
  • упорядочения (интермедиат)
  • содержания (строка)

Моих проектов -page показывает текущий проект и предварительный просмотр следующих трех проектов. Для получения следующих трех проектов я хотел бы использовать чистый MySQL-запрос. Конечно, если человек находится на одном из последних проектов, осталось еще 3 проекта.

Так что тогда ему нужно снова показать первый.

В основном Im пытается объединить эти два заявления:

SELECT * 
FROM projects 
WHERE ordering > {currentProjectOrdering} 
ORDER BY ordering ASC 

и

SELECT * 
FROM projects 
WHERE ordering > 0 
ORDER BY ordering ASC 

, а также

LIMIT 0,3 

В двух словах: получить следующие три записи с более высокой упорядоченности, чем текущий проект, если (некоторые) из них не существует, начните с порядка = 1.

Предполагая, что есть 10 проектов: Проект 1 показывает 2,3 и 4 Проект 2 показывает 3,4 и 5 ... Проект 9 показывает 10, 1 и 2

+2

Почему бы просто не объединить два утверждения где? – bnvdarklord

+0

Разве это «Союз», что вы хотите? – VanessaBR

+0

Так просто .... объединить оба условия where в одном SELECT ... –

ответ

2

Если вы хотите данные первое условие И второго условие использование

SELECT * 
FROM projects 
WHERE ordering > {currentProjectOrdering} AND ordering > 0 
ORDER BY ordering ASC 
LIMIT 0,3 

Если вы хотите, чтобы данные из первого условия ИЛИ второго условие использования

SELECT * 
FROM projects 
WHERE ordering > {currentProjectOrdering} OR ordering > 0 
ORDER BY ordering ASC 
LIMIT 0,3 
+0

. Спасибо за прояснение этого, к сожалению, это не то, что я имею в виду: OR-statement получит все мои результаты, и оператор AND получит все результаты которые имеют более высокое значение для «заказа», чем текущий проект. То, что я пытаюсь достичь, - это получить следующие три записи с более высоким порядком, чем текущий проект, если (некоторые из них) они не существуют, начните с ordering = 1. – Michiel

0

Что-то, как это должно работать (если вы ограничение, просто предполагает, что человек работает на):

 SELECT * FROM projects WHERE person = person_id && (ordering > 0 && COUNT(id) < 4) 
|| (ordering >= currentProjectOrdering && COUNT(id) >= 4)) ORDER BY ordering LIMIT 0,3; 
+0

спасибо shawn, но я не думаю, что это утверждение получит мне результаты, которые я ищу, как вы думаете, вы могли бы объяснить вам запрос ко мне? – Michiel

+0

Да, в основном он полагается на порядок операций, чтобы получить желание, которое вы хотите. Таким образом, в псевдокоде оператор where: if person == person_id, если при заказе больше 0 и существует менее 4 проектов, тогда выберите эти записи иначе, если порядок больше или равен текущемуПроектOrdering и там 4 или более записей для этого user return the top 4. –

0

мне очень интересно об этом. У меня нет mysql и я не могу проверить, но я не думаю вы собираетесь получить 3 записи, которые вы хотите в этих примерах - если вы в конце списка и вам нужно захватить 1 или 2 с начала. Я играю с TSQL - так что нет LIMIT Отсюда TOP.

Мне также интересно, сможет ли кто-нибудь сделать это лучше.

SELECT TOP 3 
    CASE 
    WHEN ORDERING >= {currentProjectOrdering} THEN ORDERING 
    ELSE {currentProjectOrdering} - ORDERING END AS DISPLAYORDER,* 
FROM SO_projects 
WHERE (ordering >= {currentProjectOrdering} AND ordering < {currentProjectOrdering}+ 3) OR ordering < 3 
ORDER BY DISPLAYORDER DESC 

Не могу пообещать, поскольку я понятия не имею о MYSQL, но вот моя попытка. В T-SQL TOP возвращает указанное количество ребер (в этом случае 3) в зависимости от ORDER BY. Не существует двусмысленности для 0 в 0,3 части (я желаю) LIMIT. Я googled, и похоже, что вещи CASE должны быть очень похожими. Вы можете избавиться от> и < из-за того, как работает LIMIT.Логика работает на SqlServer:

SELECT 
    CASE 
    WHEN ORDERING >= {currentProjectOrdering} THEN ORDERING 
    ELSE {currentProjectOrdering} - ORDERING END AS DISPLAYORDER,* 
FROM SO_projects 
WHERE (ordering >= {currentProjectOrdering} AND ordering < {currentProjectOrdering} + 3 ) OR ordering < 3 
ORDER BY DISPLAYORDER DESC 
LIMIT 0,3 
+0

кажется законным, слишком плохо Я понятия не имею, как написать это fr mysql :-(спасибо за то, что вы потратили время! – Michiel

+0

Я отредактировал и дал вам попробовать. – user1166147

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