[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: я в тупике в sql-е
dadli
здраствуите. ни как не могу решит:
есть таблица

id | autos
------
3 | bmw
7 | bmw
11| bmw
16 | bmw
18 | bmw
19 | mercedes
20 | mercedes
21 | mercedes
24 | mercedes

нужно написать запрос, которий вибрал три максималних ид-ов для каждои автомобиля, тоест нужно получит такои резултат:

11
16
18
20
21
24

можно ето одним запросом?



Спустя 18 минут, 5 секунд (16.10.2011 - 21:35) Winston написал(а):
Может так ?
SELECT MAX(`id`) AS mId, autos FROM `cars` GROUP BY `autos` LIMIT 3

Спустя 4 минуты, 16 секунд (16.10.2011 - 21:39) dadli написал(а):
нет, етот запрос вазврашает толко (один) максималние ид-и тоест

18
24

Спустя 27 секунд (16.10.2011 - 21:40) alex12060 написал(а):

SELECT `id` FROM `test`
ORDER BY `id` ASC
LIMIT
2, 9999


Но не знаю...

Можно так еще сделать, костылем. Вытащить все данные, отсортированные по ID и в массиве удалить первые 2 элемента.

Спустя 10 минут, 12 секунд (16.10.2011 - 21:50) dadli написал(а):
alex12060
не подходит, таблица изменяется, может бить в таблице окозалос например форд например 7 раза

100 | ford
102 | ford
103 | ford
104 | ford
105 | ford
106 | ford
107 | ford

Спустя 51 минута, 59 секунд (16.10.2011 - 22:42) m4a1fox написал(а):
Distin почитайте про это!

Спустя 26 минут, 18 секунд (16.10.2011 - 23:08) dadli написал(а):
m4a1fox
но в данном моменте DISTINCT не помагает smile.gif

Спустя 2 минуты, 7 секунд (16.10.2011 - 23:10) imbalance_hero написал(а):
m4a1fox
И как? У меня, допустим, нет идеи, как с помощью distinct такое сделать.

Спустя 58 минут, 49 секунд (17.10.2011 - 00:09) SerginhoLD написал(а):
Как вариант..

$db = new mysqli('localhost', 'root', '', 'test1');

$query = "SELECT `auto` FROM `cars` GROUP BY `auto`";

$sql = $db->query($query);

while ($row = $sql->fetch_array(MYSQL_NUM))
{
$q = "SELECT `id` FROM `cars` WHERE `auto`='".$row[0]."' ORDER BY `id` DESC LIMIT 3";

$s = $db->query($q);

while ($r = $s->fetch_array(MYSQL_NUM))
{
echo $r[0] . ' ';
}
echo '<br>';
}

А одним запросом что-то у меня не думается.. да фиг знает можно ли так

Спустя 8 минут, 8 секунд (17.10.2011 - 00:17) caballero написал(а):
только одним запросом нельзя
нерешаемо в реляционной алгебре

Спустя 3 минуты, 29 секунд (17.10.2011 - 00:21) imbalance_hero написал(а):
SerginhoLD
Твой вариант не выход, особенно каждый раз дёргать запрос из ПХП в Мускул. Это самый легкий, и самый неправильный способ.

Спустя 43 минуты, 43 секунды (17.10.2011 - 01:05) caballero написал(а):
order by auto,id desc
один проход фетчем, пара if и все дела и никаких дополнительны запросов
на выходе двумерный масив

Спустя 3 часа, 26 минут, 37 секунд (17.10.2011 - 04:31) alive написал(а):
SELECT * 
FROM `cars` `main`
WHERE `id` +3 > (
SELECT max( `id` )
FROM `cars`
WHERE `autos` = `main`.`autos` )
LIMIT 0 , 9999

Спустя 22 минуты, 47 секунд (17.10.2011 - 04:54) imbalance_hero написал(а):
alive
А ты запускал скрипт на разбросанных id, где есть ID без записей?
Ты предполагаешь, что именно по порядку всё должно быть? smile.gif

Вообще, идея норм, только ты её не додумал.

Спустя 1 час, 2 минуты, 43 секунды (17.10.2011 - 05:57) imbalance_hero написал(а):
Создаём процедуру в БД.
Таблица dat_test , её имя ставишь то, которое у тебя. id,auto - это поля id и авто.

Теперь создаём процедуру (может даже view было бы лучше, но мне по приколу было потестить работу процедурок), запускаем через PMA 1 раз. (если запустишь больше, хуже не будет).

DROP TABLE IF EXISTS `dat_test5`;

DELIMITER |

DROP PROCEDURE IF EXISTS `dat_pro` |

CREATE PROCEDURE `dat_pro`()
BEGIN
CREATE TABLE `dat_test5`
SELECT `id`,`auto` FROM `dat_test` ORDER BY `auto`,`id`;
ALTER TABLE `dat_test5`
ADD `i` INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
SELECT * FROM `dat_test5` `main`
WHERE `i` +3 > (
SELECT max( `i` ) FROM `dat_test5` WHERE `auto` = `main`.`auto`
);
DROP TABLE IF EXISTS `dat_test5`;
END;
|


DELIMITER ;


Теперь запрос на получения данных очень простой. Лишь 1 вызов:
CALL `dat_pro` ();

Вся логика лежит на стороне mysql. Работает достаточно долго, на 50 записей: 0.0054 с. Сайт нагруженный постоянно (150 000 кликов в сутки), поэтому проверил на боевых условиях.
Создал я через 2 запроса, первый сделал дополнительную таблицу (которая выполняет временную функцию) такую, как мне надо, второй - сделал выборку по временной таблице по скрипту, который предложил alive.

Спустя 6 часов, 42 минуты, 35 секунд (17.10.2011 - 12:39) alive написал(а):
Цитата (imbalance_hero @ 17.10.2011 - 05:54)
А ты запускал скрипт на разбросанных id, где есть ID без записей?
Ты предполагаешь, что именно по порядку всё должно быть? smile.gif

согласен, не додумал! я вообще удивился, когда он max(`id`) без group by вывел. И да, если id не по порядку, нужно более мудренное условие.

За процедурку спасибо! только я еще не разобрался как она работает.

Спустя 54 минуты, 8 секунд (17.10.2011 - 13:33) dadli написал(а):
SerginhoLD
нет, не так

caballero
если не получается в одном запросе, я так же думал, получить данние в масиве и потом получит уже из них нужние данние

alive
не совсем правилни варянт, работает толко втом случе, если все ид-и подряд (1,2,3,4...) но идеа хорошая smile.gif

imbalance_hero
ну спасибо, ваш работа трудоемкий, smile.gif но нагрузка на сервере не мало да,


балшое спасибо всем, кто дал ответи, спасибо.


_____________


когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.

Быстрый ответ:

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