Skocz do zawartości

Sortowanie a później grupowanie


Mar

Rekomendowane odpowiedzi

Witam,

Mam tabele:

id | haslo | pozycja | data

i chciałem, zrobić zapytanie, by pogrupować to po id ale tak, by zwracało mi pozycję z najnowszej daty, gdy robię:

SELECT * FROM `pozycje` GROUP BY id_slowa

zwraca mi pozycję, ale z pierwszego rekordu jak został dodany do bazy, logicznie na to patrzeć powinienem zrobić:

(SELECT * FROM `pozycje` where `pozycja`='1' ORDER by data) GROUP BY id_slowa

czyli posortować po dacie i dopiero zgrupować, ale to chyba nie takie proste :P

..i żeby było ciekawiej mam dwie tabele:

'hasla'

id | haslo | ....

oraz 'pozycje'

id_slowa | pozycja | data

czyli mam coś takiego:

SELECT id AS nowe_id, haslo, pozycja, pozycje.data
FROM hasla
INNER JOIN pozycje ON hasla.id = pozycje.id_slowa
WHERE pozycja = '1'
GROUP BY nowe_id

..i to mi działa ale ten sam problem co wyżej, zwraca mi pierwsze sprawdzenie pozycji, a chcę ostatnie :/

Mógłbym to zrobić z wykorzystaniem php, czyli brać słowo z 'hasla' sprawdzać ostatnią pozycję rekokor po rekordzie, ale chyba tak zajadę bazę, bo jak będę miał 1000 haseł to przy jednym takim zapytaniu muszę zrobić 1000 połączeń z bazą... dobrze to rozumuje? chyba, że tak się nie da i to jedyne rozwiązanie...

M.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

Jakiś czas temu był podobny temat na który udzieliłem odpowiedzi jak to zrobić :pisze:

-> https://www.forum.optymalizacja.com/topic/190501-mysql-group-by-problem/

:)

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

:jupi: .. dałem rade, dzięki:

SELECT * FROM (SELECT id AS nowe_id, haslo, pozycja, pozycje.data
FROM hasla
INNER JOIN pozycje ON hasla.id = pozycje.id_slowa
WHERE pozycja =  '1'
ORDER BY data DESC) tmp GROUP BY nowe_id

M.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

Odkopię temat, bo znów poległem przy moich amatorskich poczynaniach, nie wiem jak logicznie rozgryźć to zapytanie:

SELECT * FROM (SELECT id AS nowe_id, haslo, pozycja, pozycje.data FROM hasla 
INNER JOIN pozycje ON hasla.id = pozycje.id_slowa WHERE pozycja='-' ORDER BY data DESC) tmp GROUP BY nowe_id

..i tym zapytaniem chciałem pobierać wszystkie hasła, których nowsza pozycja jest "-", problem w tym, że zwraca mi hasła, których np. obecnie pozycja nie jest już "-".

dla przykładu dwa rekordy:

53|slowo1|5|2014-07-07

53|slowo1|-|2014-06-26

... i taki rekord zostanie zwrócony, a nie chciałbym go, i jak to teraz ugryźć, choć teraz mi przychodzi jeszcze jeden pomysł, choć nie wiem jak go przekazać w kod, tz... pobrać wszystkie rekordy, zgrupować i wtedy dać warunek "-", ale chyba, serwer, baza itd tego nie uciągnie.. :/

M.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

Nie rozumiem tej kwestii nowsza pozycja jest "-"...

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Mam rekordy:

53|slowo1|5|2014-07-07

53|slowo1|-|2014-06-26

...

chcę by w takim przypadku nie zwróciło mi słowa o id=53

ale jak już mam:

53|slowo1|-|2014-07-07 // czyli aktualna/nowsza pozycja jest "-"

53|slowo1|6|2014-06-26

to chcę by zwróciło mi

53|slowo1|-|2014-07-07.

... a logicznie to tak, sprawdzam sobie pozycję dla poszczególnych słów i chcę zrobić zestawienie tych, które nie mają żadnej pozycji.

M.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

Masz ewidentnie źle zaprojektowana tabelę, bo

53|slowo1|5|2014-07-07

pozycja jest liczbą, więc jest typem INTEGER .. a nie VARCHAR < CHAR> Wiec jeśli w danym dni pozycji nie masz powinieneś wstawić NULL oczywiście NULL to nie jest to samo co pusty rekord np spacja.

Nie wiem jak masz zdefiniowane pole na datę <2014-07-07> ale w tym wypadku powinno być typu DATE... wtedy mógł byś tworzyć zapytania z klauza IS NULL. Nie podam Ci przykładowego zapytania, bo musiał bym mieć dostęp do danych tak na sucho, to mi jest ciężko je ułożyć :pisze:

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, masz racje... moja baza dokładnie to:

CREATE TABLE IF NOT EXISTS `pozycje` (
`id_slowa` mediumint(8) NOT NULL DEFAULT '0',
`pozycja` varchar(100) NOT NULL DEFAULT '',
`data` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
..ale załóżmy, że poprawie na INTEGER, to co to zmienia, tak będą rekordy, które będą miały wartość.. lub nie, przykład:

53|slowo1|5|2014-07-07

53|slowo1|NULL|2014-06-26

więc... jak w takim przypadku zapytać, by z powyższych rekordów nie zwrócić żadnego rekordu a już dla:

53|slowo1|NULL|2014-07-07

53|slowo1|5|2014-06-26

już rekord:

53|slowo1|NULL|2014-07-07

bo on obecnie nie ma żadnej pozycji.

M.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

I.. i jak wyżej pisałem, to, że baza jest źle zaprojektowana nie ma znaczenia, popatrz teraz:

CREATE TABLE IF NOT EXISTS `pozycje` (
  `id_slowa` mediumint(8) NOT NULL DEFAULT '0',
  `pozycja` int(100) DEFAULT NULL,
  `data` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Zrzut danych tabeli `pozycje`
--

INSERT INTO `pozycje` (`id_slowa`, `pozycja`, `data`) VALUES
(19, 1, '2014-06-29 00:00:00'),
(19, NULL, '2014-06-21 00:00:00'),
(19, 3, '2014-06-28 00:00:00');

i zapytanie:

SELECT * FROM (SELECT id_slowa, pozycja, data
FROM pozycje
WHERE pozycja IS NULL ORDER by data DESC) tmp
GROUP BY id_slowa

..i zwraca mi rekord, a ja chcę by w takim przypadku mi go nie zwracało, bo on ma aktualnie pozycję (zaindeksowany), więc tu może nie kwestia zapytania, struktury bazy danych a logicznego rozwiązania s którym nie mogę sobie poradzić.

Może najpierw powinienem to jakoś pogrupować po dacie, by pozbyć się rekordów z NULL, które już nie mają NULL i wtedy wprowadzać warunek WHERE pozycja IS NULL?? ale jak? hmm...

M.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach


to, że baza jest źle zaprojektowana nie ma znaczenia,
Jak jest zaprojektowana baza ma ogromne znaczenie tylko jeszcze tego na tym etapie nie widzisz...

Twoje dane to:

danezbazy.jpg

I napisz jakiś jednoznacznie/czytelnie/ co ty chcesz z tymi danymi zrobić, bo piszesz tak, że nie mam pojęcia o co ci chodzi :olaboga:


.i zwraca mi rekord, a ja chcę by w takim przypadku mi go nie zwracało, bo on ma aktualnie pozycję (zaindeksowany), więc tu może nie kwestia zapytania, struktury bazy danych a logicznego rozwiązania s którym nie mogę sobie poradzić.

Poza tym potrzeba więcej danych testowych...

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Tabela zawiera stronę oraz jej pozycję i datę sprawdzenia... i co za tym idzie, pozycję danej strony mogę sprawdzać wielokrotnie, co też robię i zakładam, że jeśli dana strona nie ma pozycji nie jest zaindeksowana.

Ja chcę pobrać te strony, które nie są zaindeksowane, czyli takie które przy ostatnim sprawdzeniu mają NULL a wcześniej mogły być na jakiś pozycjach.

Oto więcej danych:

INSERT INTO `pozycje` (`id_slowa`, `pozycja`, `data`) VALUES
(19, 2, '2014-06-29 00:00:00'),
(19, NULL, '2014-06-21 00:00:00'),
(19, 3, '2014-06-28 00:00:00'),
(1, NULL, '2014-06-27 00:00:00'),
(1, 2, '2014-06-21 00:00:00'),
(10, 2, '2014-06-29 00:00:00'),
(20, NULL, '2014-06-21 00:00:00'),
(20, NULL, '2014-06-25 00:00:00'),
(20, NULL, '2014-07-02 00:00:00');

.. i wyjaśnię, teraz to tak, strona id=19 obecnie jest na 2 pozycji i ten rekord ma być pominięty,

.. strona id=1 obecnie nie ma pozycji, i takie strony chcę otrzymać.

Czyli zapytanie, które chcę zbudować powinno zwrócić tylko:

1|NULL|2014-06-27 00:00:00

20|NULL|2014-06-21 00:00:00

M.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

OK, zobaczę co da się zrobić ... < im więcej danych ty m lepiej > :pisze:

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

28ji71e.jpg

SELECT * FROM pozycje p
WHERE p.`pozycja` IS NULL
AND
(
  SELECT p2.`id_slowa`  FROM pozycje p2
  WHERE p2.`pozycja` IS NOT NULL AND p2.`id_slowa` = p.`id_slowa` LIMIT 1

)
ORDER BY p.`data` DESC;

Dla mnie to trochę bez sensu pobieranie w ten sposób danych bez połączenia ich z konkretną datą sprawdzania pozycji.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

No i o to mi chodziło.. ma to sens, bo jest to powiązane z najnowszą datą (ostatnim sprawdzeniem).

Działa, dzięki... jutro to przetestuje jeszcze na wszystkich rekordach... a i mam jeszcze jedną prośbę, mógłbyś mi pomóc dorzuć do tego zapytania jeszcze połączenie z tabelą hasla:

id|haslo|... za pomocą, jak w pierwszym poście?

M.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach


No i o to mi chodziło.. ma to sens, bo jest to powiązane z najnowszą datą (ostatnim sprawdzeniem).
Te zapytanie nie bierz pod uwagę daty tylko wystąpienie rekordu który miał pozycję i raz zdarzyło się, że nie miał.

a i mam jeszcze jedną prośbę, mógłbyś mi pomóc dorzuć do tego zapytania jeszcze połączenie z tabelą hasla:
Polecam zacząć naukę SQL od podstaw ..... i powodzenia w samodzielnej pracy.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności