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:

  Cytat
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

  W dniu 14.07.2014 o 16:48, Mar napisał(a):

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:

  W dniu 14.07.2014 o 16:48, Mar napisał(a):

.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

  W dniu 14.07.2014 o 20:34, Mar napisał(a):

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ł.
  W dniu 14.07.2014 o 20:34, Mar napisał(a):

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