Mysql заявка

NewGuy

Registered
Здравейте. Исках да попитам как мога да направя заявка, която да изглежда така.

SELECT pole from tablica WHERE tochka='15' и разликата между последните ID-та е по-малка от 10

Идеята е да ми изкара запис който е показан да кажем 20 пъти но ако едното Id му е 500 другото 505 да ми го изкара така. Трябва да е за последните 2 числа.
 
Глупаво съм го обяснил.

Искам да избира число от базата данни, което се повтаря в последните 10 записа.

Имам 11 записа

0
2
3
4
5
6
7
8

1
9
1

Тук числото 1 се повтаряв последните 10 записа. Искам заявката да ми върне числото 1. :?:
 
Код:
<?
$q = Mysql_query("SELECT...Заявката дето изкарва последните 11 записа..");

$array = array();

While ( $row = mysql_fetch_assoc($q) )
{
if ( in_array($row['id'],$array) )
{
$spec = $row['id'];
}
$array[] = $row['id'];
}

echo $spec;
?>
Не съм го тествал ,но би трябвало да работи...Като се прибера ще я тествам ,ако не работи..
 
vik96 по твоята идея изкарва числото ако го има в последните 11 записа. На мен ми трябва да го изкарва ако го има на повече от 1 запис.

Karcho твоето не успях да го схвана.
 
NewGuy, първо да видим дали съм разбрал правилно. Имаш следните записи:

0
2
3
4
5
6
7
8
1
9
1

и като краен резултат искаш да изкараш 1?

А ако беше

2
2
3
4
5
6
7
8
1
9
1
пак ли искаш резултата да е само 1? Или този път вече ще искаш и 1 и 2?

Кодът, който аз ще ти дам изкарва само 1 и при двата случая.

SELECT колони FROM (SELECT * FROM таблица ORDER BY id DESC LIMIT 10) AS result GROUP BY колона_с_точките HAVING COUNT(колона_с_точките) > 1

колони - тук изреждаш всички колони, които искаш да изкарваш като резултат (примерно id, самото число и каквото друго имаш в таблицата)

таблица - името на таблицата, от която взимаш
резултатите

id - id колоната на таблицата, за да може да подредиш най-старите записи, най-отгоре

колона_с_точките - колоната, в която записваш тия 0, 1, 2, 3 и искаш да провериш дали се повтаря


И сега малко повече за заявката. Ще започна в реда, в който стават нещата.

Първо погледни удебелената заявка. Тя ти е необходима, защото искаш да взимаш последните 10 записа и в тях да търсиш. Т.е ако имаш както е втория пример, който ти дадох повтарящо се в 11-я запис, то да не се показва.

По нея няма какво толкова да се обяснява. Тя взима всички колони от оригиналната таблица, подрежда ги в обратен ред на ID (т.е последните да са първи) и ги ограничава до 10 записа (понеже искаш да гледаш последните 10 и този 11-и да не се включва в броенето).

След като направиш тази заявка на таблицата и се дава имe result, защото mysql иначе хвърля грешка.

След което заявката ти вече започва да изглежда така:

SELECT колони FROM result GROUP BY колона_с_точките HAVING COUNT(колона_с_точките) > 1

В тази заявка в SELECT клаузата оказваш колоните, които искаш да изкараш (или не препоръчително - *)
FROM клаузата вече е новата таблица от горната заявка.
И тук вече идва същинската част. GROUP BY групира еднаквите числа в колоната, която му зададеш (в твоя случай колоната с точки), а HAVING просто ограничава записите до тези, които имат повече от 1 повторения (т.е са повтарящи се)


И сега един пример с примерна таблица с две полета:

CREATE table test (
id int auto_increment primary key,
points int
)

и в нея имаш следните записи:

test
id|points
1|2
2|2
3|3
4|4
5|5
6|6
7|7
8|8
9|1
10|9
11|1

както виждаш последните 10 записа са ти от 2 до 11. Т.е двойката в първия запис няма да играе никаква роля.

И сега първата заявка ще ти изглежда така:

(SELECT * FROM test ORDER BY id DESC LIMIT 10) AS result

и тя ще изкара като резултат следната таблица

result
id|points
11|1
10|9
9|1
8|8
7|7
6|6
5|5
4|4
3|3
2|2

И сега втората заявка вече изглежда така:
SELECT points FROM result GROUP BY points HAVING COUNT(points) > 1

и като резултат ще получиш:

1, ако искаш и id номера да изкарваш трябва да ти стане SELECT id, points или SELECT *

Ами това е, по-добре не мога да го обясня.


П.С. Ако не искаш последните 10 резултата, а всички - тогава начина на Karcho ти върши идеална работа (то е г/д същото като моето, само дето търси за всички записи повтарящите се)
 
Супер си! Браво! Много добро обяснение всичко ми стана ясно. Честита ти 300 точка. :?:
 

Back
Горе