[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка
123456
Есть таблица
+----+--------+----+
| id | number | lv |
+----+--------+----+
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 1 | 2 |
| 4 | 2 | 2 |
| 5 | 3 | 2 |
| 6 | 1 | 3 |
| 7 | 2 | 3 |
| 8 | 3 | 3 |
+----+--------+----+


И есть три числовые переменные
$lv
$num
$kol

Необходимо сделать выборку.

$lv должно быть = lv из таблицы, а если такого $lv в таблице нет, то надо выбрать записи с максимальным значение lv (в нашем случае это три записи со значение lv==3)

Далее, в выбранных записях, Если $num > количество_записей_с_указанным_lv, то выбираем $kol случайных записей из уже выбранных, если же $num < количество_записей_с_указанным_lv, то выбираем $kol записей с number > $num в порядке очереди.Если выбирается меньше записей, чем $kol, то для недостающихся записей выборку производим по ($num > количество_записей_с_указанным_lv)


Как-то так...
sergeiss
Как всегда, встречный вопрос: а свои наработки какие на эту тему?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
123456
Думаю делать в виде функции..
Сделал только первую часть.

CREATE DEFINER=`root`@`localhost` PROCEDURE `qwe`(IN `p_lv` INT(4))
DETERMINISTIC
COMMENT 'Some proc!'
BEGIN

DECLARE iLv INT DEFAULT 0;

SELECT MAX(`lv`) INTO iLv FROM `table`;

IF p_lv < iLv THEN
SET iLv = p_lv;
END IF;

SELECT * FROM `table` WHERE `lv` = iLv;

END
123456
Получилось вот что

CREATE DEFINER=`root`@`localhost` PROCEDURE `qwe`(IN `p_lv` INT(4), IN `p_num` INT(4), IN `p_kol` INT(1))
DETERMINISTIC
BEGIN

DECLARE iLv INT DEFAULT 0;
DECLARE iCount INT DEFAULT 0;
DECLARE iNum INT DEFAULT 0;
DECLARE iParams INT DEFAULT 0;

SELECT MAX(`lv`) INTO iLv FROM `table`;

IF p_lv < iLv THEN
SET iLv = p_lv;
END IF;

SELECT COUNT(*) INTO iCount FROM `table` WHERE `lv` = iLv;

IF p_num >= iCount THEN

SELECT
* FROM `table` WHERE `lv` = iLv ORDER BY RAND() LIMIT p_kol;

ELSE

SELECT
COUNT(*) INTO iNum
FROM `table`
WHERE `lv` = iLv AND
`number` > p_num
ORDER BY `number` ASC
LIMIT
p_kol;

IF iNum < p_kol THEN

SET iParams = p_kol - iNum;


(
SELECT *
FROM `table`
WHERE `lv` = iLv AND
`number` > p_num
ORDER BY `number` ASC
LIMIT
iNum

)
UNION
(
SELECT * FROM `table` WHERE `lv` = iLv ORDER BY RAND() LIMIT iParams
);


ELSE

SELECT
*
FROM `table`
WHERE `lv` = iLv AND
`number` > p_num
ORDER BY `number` ASC
LIMIT
p_kol;

END IF;

END IF;

END


Может кто поможет привести в более адекватный вид?
А то как-то в одной функции 7 запросов к одной таблице...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.