есть таблица
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
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
не подходит, таблица изменяется, может бить в таблице окозалос например форд например 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 не помагает
но в данном моменте DISTINCT не помагает

Спустя 2 минуты, 7 секунд (16.10.2011 - 23:10) imbalance_hero написал(а):
m4a1fox
И как? У меня, допустим, нет идеи, как с помощью distinct такое сделать.
И как? У меня, допустим, нет идеи, как с помощью 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 и все дела и никаких дополнительны запросов
на выходе двумерный масив
один проход фетчем, пара 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 без записей?
Ты предполагаешь, что именно по порядку всё должно быть?
Вообще, идея норм, только ты её не додумал.
А ты запускал скрипт на разбросанных id, где есть ID без записей?
Ты предполагаешь, что именно по порядку всё должно быть?

Вообще, идея норм, только ты её не додумал.
Спустя 1 час, 2 минуты, 43 секунды (17.10.2011 - 05:57) imbalance_hero написал(а):
Создаём процедуру в БД.
Таблица dat_test , её имя ставишь то, которое у тебя. id,auto - это поля id и авто.
Теперь создаём процедуру (может даже view было бы лучше, но мне по приколу было потестить работу процедурок), запускаем через PMA 1 раз. (если запустишь больше, хуже не будет).
Теперь запрос на получения данных очень простой. Лишь 1 вызов:
Вся логика лежит на стороне mysql. Работает достаточно долго, на 50 записей: 0.0054 с. Сайт нагруженный постоянно (150 000 кликов в сутки), поэтому проверил на боевых условиях.
Создал я через 2 запроса, первый сделал дополнительную таблицу (которая выполняет временную функцию) такую, как мне надо, второй - сделал выборку по временной таблице по скрипту, который предложил alive.
Таблица 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 без записей? Ты предполагаешь, что именно по порядку всё должно быть? ![]() |
согласен, не додумал! я вообще удивился, когда он max(`id`) без group by вывел. И да, если id не по порядку, нужно более мудренное условие.
За процедурку спасибо! только я еще не разобрался как она работает.
Спустя 54 минуты, 8 секунд (17.10.2011 - 13:33) dadli написал(а):
SerginhoLD
нет, не так
caballero
если не получается в одном запросе, я так же думал, получить данние в масиве и потом получит уже из них нужние данние
alive
не совсем правилни варянт, работает толко втом случе, если все ид-и подряд (1,2,3,4...) но идеа хорошая
imbalance_hero
ну спасибо, ваш работа трудоемкий,
но нагрузка на сервере не мало да,
балшое спасибо всем, кто дал ответи, спасибо.
нет, не так
caballero
если не получается в одном запросе, я так же думал, получить данние в масиве и потом получит уже из них нужние данние
alive
не совсем правилни варянт, работает толко втом случе, если все ид-и подряд (1,2,3,4...) но идеа хорошая

imbalance_hero
ну спасибо, ваш работа трудоемкий,

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