🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych
11 messages
11 total messages Started by Leszek Zur Fri, 05 Jun 2015 14:33
2 limity
#194472
Author: Leszek Zur
Date: Fri, 05 Jun 2015 14:33
27 lines
2074 bytes
Baza MySQL.
Mam tabelę z kolumnami: państwo, miasto, mieszkancy.
W tabeli mieszkańcy podana jest ilość mieszkańców danego miasta.
Chce napisać zapytanie, które zwróci mi tą tabelę ale z 2 limitami.
Chcę, żeby zwróciło mi maksimum x miast ale żeby z każdego państwa było 
maksimum y miast o największej liczbie mieszkańców.

Przykładowo dla x=5 i y=2 i następującej tabeli:
Francja	Paryż		2000
Francja	Lille		500
Polska	Warszawa	1000
Polska	Wrocław		700
Polska	Opole		500
Niemcy	Berlin		2000
Niemcy	Dortmund	1000
Włochy	Rzym		1500

chcę żeby odrzuciło mi Opole (bo przekroczony y dla Polski), oraz 
Dortmund i Rzym (bo przekroczony x).
Do tej pory robiłem zapytanie o listę wszystkich państw, dla każdego 
państwa pobierałem listę największych miast ograniczoną przez y, 
zliczałem ile już mam miast i jak osiągnąłem x to kończyłem.

Może da się to zapisać jako jedno zapytanie, które będzie pewnie szybsze 
od serii wielu mniejszych ?

Leszek
Re: 2 limity
#194473
Author: pawel.socha
Date: Mon, 08 Jun 2015 14:49
37 lines
2521 bytes
W dniu piątek, 5 czerwca 2015 16:33:40 UTC+2 użytkownik Leszek Zur napisał:
> Baza MySQL.
> Mam tabelę z kolumnami: państwo, miasto, mieszkancy.
> W tabeli mieszkańcy podana jest ilość mieszkańców danego miasta.
> Chce napisać zapytanie, które zwróci mi tą tabelę ale z 2 limitami.
> Chcę, żeby zwróciło mi maksimum x miast ale żeby z każdego państwa było 
> maksimum y miast o największej liczbie mieszkańców.
> 
> Przykładowo dla x=5 i y=2 i następującej tabeli:
> Francja	Paryż		2000
> Francja	Lille		500
> Polska	Warszawa	1000
> Polska	Wrocław		700
> Polska	Opole		500
> Niemcy	Berlin		2000
> Niemcy	Dortmund	1000
> Włochy	Rzym		1500
> 
> chcę żeby odrzuciło mi Opole (bo przekroczony y dla Polski), oraz 
> Dortmund i Rzym (bo przekroczony x).
> Do tej pory robiłem zapytanie o listę wszystkich państw, dla każdego 
> państwa pobierałem listę największych miast ograniczoną przez y, 
> zliczałem ile już mam miast i jak osiągnąłem x to kończyłem.
> 
> Może da się to zapisać jako jedno zapytanie, które będzie pewnie szybsze 
> od serii wielu mniejszych ?
> 
> Leszek

Być może twoim rozwiązaniem jest "order by" wielość_miast oraz "having" wielkosc_miast >= y

Tak z glowy:
SELECT * from Tabela  order by wielość_miast desc having >= y LIMIT x


--
Pawel Socha
Re: 2 limity
#194474
Author: merlin
Date: Mon, 08 Jun 2015 14:59
46 lines
2766 bytes
On Friday, 5 June 2015 16:33:40 UTC+2, Leszek Zur  wrote:
> Baza MySQL.
> Mam tabelę z kolumnami: państwo, miasto, mieszkancy.
> W tabeli mieszkańcy podana jest ilość mieszkańców danego miasta.
> Chce napisać zapytanie, które zwróci mi tą tabelę ale z 2 limitami.
> Chcę, żeby zwróciło mi maksimum x miast ale żeby z każdego państwa było 
> maksimum y miast o największej liczbie mieszkańców.
> 
> Przykładowo dla x=5 i y=2 i następującej tabeli:
> Francja	Paryż		2000
> Francja	Lille		500
> Polska	Warszawa	1000
> Polska	Wrocław		700
> Polska	Opole		500
> Niemcy	Berlin		2000
> Niemcy	Dortmund	1000
> Włochy	Rzym		1500
> 
> chcę żeby odrzuciło mi Opole (bo przekroczony y dla Polski), oraz 
> Dortmund i Rzym (bo przekroczony x).
> Do tej pory robiłem zapytanie o listę wszystkich państw, dla każdego 
> państwa pobierałem listę największych miast ograniczoną przez y, 
> zliczałem ile już mam miast i jak osiągnąłem x to kończyłem.
> 
> Może da się to zapisać jako jedno zapytanie, które będzie pewnie szybsze 
> od serii wielu mniejszych ?
> 
> Leszek

Ciepło? 

mysql> select *  from miasta having populacja > 500 order by 3 desc ;
+---------+----------+-----------+
| panstwo | miasto   | populacja |
+---------+----------+-----------+
| Francja | Paryz    |      2000 |
| Niemcy  | Berlin   |      2000 |
| Wlochy  | Rzym     |      1500 |
| Polska  | Warszawa |      1000 |
| Niemcy  | Dortmund |      1000 |
| Polska  | Wroclaw  |       700 |
+---------+----------+-----------+
6 rows in set (0,00 sec)


Pawel Socha
Re: 2 limity
#194475
Author: PawelS cbrbob(at)wbcd(dot)pl
Date: Sun, 14 Jun 2015 07:29
48 lines
2788 bytes
merlin pisze:
> On Friday, 5 June 2015 16:33:40 UTC+2, Leszek Zur  wrote:
>> Baza MySQL.
>> Mam tabelę z kolumnami: państwo, miasto, mieszkancy.
>> W tabeli mieszkańcy podana jest ilość mieszkańców danego miasta.
>> Chce napisać zapytanie, które zwróci mi tą tabelę ale z 2 limitami.
>> Chcę, żeby zwróciło mi maksimum x miast ale żeby z każdego państwa było 
>> maksimum y miast o największej liczbie mieszkańców.
>>
>> Przykładowo dla x=5 i y=2 i następującej tabeli:
>> Francja	Paryż		2000
>> Francja	Lille		500
>> Polska	Warszawa	1000
>> Polska	Wrocław		700
>> Polska	Opole		500
>> Niemcy	Berlin		2000
>> Niemcy	Dortmund	1000
>> Włochy	Rzym		1500
>>
>> chcę żeby odrzuciło mi Opole (bo przekroczony y dla Polski), oraz 
>> Dortmund i Rzym (bo przekroczony x).
>> Do tej pory robiłem zapytanie o listę wszystkich państw, dla każdego 
>> państwa pobierałem listę największych miast ograniczoną przez y, 
>> zliczałem ile już mam miast i jak osiągnąłem x to kończyłem.
>>
>> Może da się to zapisać jako jedno zapytanie, które będzie pewnie szybsze 
>> od serii wielu mniejszych ?
>>
>> Leszek
> 
> Ciepło? 
Blisko ?

> mysql> select *  from miasta having populacja > 500 order by 3 desc ;
> +---------+----------+-----------+
> | panstwo | miasto   | populacja |
> +---------+----------+-----------+
> | Francja | Paryz    |      2000 |
> | Niemcy  | Berlin   |      2000 |
> | Wlochy  | Rzym     |      1500 |
> | Polska  | Warszawa |      1000 |
> | Niemcy  | Dortmund |      1000 |
> | Polska  | Wroclaw  |       700 |
> +---------+----------+-----------+
> 6 rows in set (0,00 sec)
Moim skromnym zdaniem zdaniem podałeś rozwiązane znając dane wejściowe.
Teraz podziel sobie zawartość kolumny "populacja" przez 10
i sprawdź czy zapytanie w dalszym ciągu zwraca oczekiwany wynik ?
Re: 2 limity
#194476
Author: Leszek Zur
Date: Sun, 14 Jun 2015 19:34
7 lines
1248 bytes
Odpowiadam sam sobie i dla potomnych.
Poprawne rozwiązanie jest na http://sqlfiddle.com/#!9/af2799/1
Nie ja jestem jego autorem.
Autora zobaczyć można na
https://forum.4programmers.net/Bazy_danych/253381-2_limity_-_w_zapytaniu_i_podzapytaniu

Leszek
Re: 2 limity
#194477
Author: Adam
Date: Sun, 14 Jun 2015 19:45
13 lines
1089 bytes
W dniu 2015-06-14 o 21:34, Leszek Zur pisze:
> Odpowiadam sam sobie i dla potomnych.
> Poprawne rozwiązanie jest na http://sqlfiddle.com/#!9/af2799/1
 > (...)

A SELECT TOP dla MS-SQL nie jest jeszcze prostszy?



-- 
Pozdrawiam.

Adam
Re: 2 limity
#194478
Author: Leszek Zur
Date: Mon, 15 Jun 2015 12:06
17 lines
1809 bytes
W dniu 2015-06-14 o 21:45, Adam pisze:
> A SELECT TOP dla MS-SQL nie jest jeszcze prostszy?

Po pierwsze ja mam MySQL a nie MS-SQL co wyraźnie zaznaczyłem w 
pierwszym poście

Po drugie z tego co wyczytałem TOP jest synonimem LIMIT więc nie ma 
żadnego wpływu na wydajność

Po trzecie problemem (przynajmniej dla mnie) było takie sformułowanie 
zapytania aby uwzględnić limit ilości miast w danym państwie a nie limit 
całkowity.

Ale jeśli masz propozycję lepszego (szybszego) zapytania to chętnie je 
zobaczę.

Leszek
Re: 2 limity
#194479
Author: Marek Horodyski
Date: Mon, 14 Dec 2015 02:35
23 lines
2243 bytes
W dniu poniedziałek, 15 czerwca 2015 14:06:17 UTC+2 użytkownik Leszek Zur napisał:
> W dniu 2015-06-14 o 21:45, Adam pisze:
> > A SELECT TOP dla MS-SQL nie jest jeszcze prostszy?
> 
> Po pierwsze ja mam MySQL a nie MS-SQL co wyraźnie zaznaczyłem w 
> pierwszym poście
> 
> Po drugie z tego co wyczytałem TOP jest synonimem LIMIT więc nie ma 
> żadnego wpływu na wydajność
> 
> Po trzecie problemem (przynajmniej dla mnie) było takie sformułowanie 
> zapytania aby uwzględnić limit ilości miast w danym państwie a nie limit 
> całkowity.
> 
> Ale jeśli masz propozycję lepszego (szybszego) zapytania to chętnie je 
> zobaczę.
> 
> Leszek

Czy MySQL ma coś takiego jak funkcje statystyczne Oracla? Trudno mi tu je opisać, bo to taka specyfika, ale to ma ogromne możliwości. Tam można fragmentować i sortować te fragmenty, a następnie osadzić to jako podzapytanie z którego wybiera się limitowane zakresy.

Pozdr.,
Marek Horodyski
Re: 2 limity
#194480
Author: M.M.
Date: Mon, 14 Dec 2015 12:01
5 lines
1689 bytes
On Sunday, June 14, 2015 at 9:34:43 PM UTC+2, Leszek Zur wrote:
> Odpowiadam sam sobie i dla potomnych.
> Poprawne rozwiązanie jest na http://sqlfiddle.com/#!9/af2799/1
Nie widać tam zapytania.
Pozdrawiam
Re: 2 limity
#194481
Author: geos
Date: Mon, 14 Dec 2015 12:48
9 lines
1250 bytes
On 14.12.2015 13:01, M.M. wrote:
> On Sunday, June 14, 2015 at 9:34:43 PM UTC+2, Leszek Zur wrote:
>> Odpowiadam sam sobie i dla potomnych.
>> Poprawne rozwiązanie jest na http://sqlfiddle.com/#!9/af2799/1
> Nie widać tam zapytania.
> Pozdrawiam
>

widać, widać.
Re: 2 limity
#194482
Author: M.M.
Date: Mon, 14 Dec 2015 13:17
13 lines
1733 bytes
On Monday, December 14, 2015 at 1:48:10 PM UTC+1, geos wrote:
> On 14.12.2015 13:01, M.M. wrote:
> > On Sunday, June 14, 2015 at 9:34:43 PM UTC+2, Leszek Zur wrote:
> >> Odpowiadam sam sobie i dla potomnych.
> >> Poprawne rozwiązanie jest na http://sqlfiddle.com/#!9/af2799/1
> > Nie widać tam zapytania.
> > Pozdrawiam
> >
> 
> widać, widać.

Nie wiedziałem że trzeba napisać dwa razy, ale spoko.
nie widać, nie widać ;-)
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads