Mar Opublikowano 5 Lipca 2014 Udostępnij Opublikowano 5 Lipca 2014 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 ..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 Więcej opcji udostępniania...
Mion Opublikowano 5 Lipca 2014 Udostępnij Opublikowano 5 Lipca 2014 Jakiś czas temu był podobny temat na który udzieliłem odpowiedzi jak to zrobić -> 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 Więcej opcji udostępniania...
Mar Opublikowano 5 Lipca 2014 Autor Udostępnij Opublikowano 5 Lipca 2014 .. 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 Więcej opcji udostępniania...
Mar Opublikowano 11 Lipca 2014 Autor Udostępnij Opublikowano 11 Lipca 2014 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 Więcej opcji udostępniania...
Mion Opublikowano 11 Lipca 2014 Udostępnij Opublikowano 11 Lipca 2014 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 Więcej opcji udostępniania...
Mar Opublikowano 11 Lipca 2014 Autor Udostępnij Opublikowano 11 Lipca 2014 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 Więcej opcji udostępniania...
Mion Opublikowano 11 Lipca 2014 Udostępnij Opublikowano 11 Lipca 2014 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ć 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 Więcej opcji udostępniania...
Mar Opublikowano 11 Lipca 2014 Autor Udostępnij Opublikowano 11 Lipca 2014 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 Więcej opcji udostępniania...
Mar Opublikowano 14 Lipca 2014 Autor Udostępnij Opublikowano 14 Lipca 2014 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 Więcej opcji udostępniania...
Mion Opublikowano 14 Lipca 2014 Udostępnij Opublikowano 14 Lipca 2014 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: I napisz jakiś jednoznacznie/czytelnie/ co ty chcesz z tymi danymi zrobić, bo piszesz tak, że nie mam pojęcia o co ci chodzi .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 Więcej opcji udostępniania...
Mar Opublikowano 14 Lipca 2014 Autor Udostępnij Opublikowano 14 Lipca 2014 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 Więcej opcji udostępniania...
Mion Opublikowano 14 Lipca 2014 Udostępnij Opublikowano 14 Lipca 2014 OK, zobaczę co da się zrobić ... < im więcej danych ty m lepiej > 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 Więcej opcji udostępniania...
Mion Opublikowano 14 Lipca 2014 Udostępnij Opublikowano 14 Lipca 2014 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 Więcej opcji udostępniania...
Mar Opublikowano 14 Lipca 2014 Autor Udostępnij Opublikowano 14 Lipca 2014 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 Więcej opcji udostępniania...
Mion Opublikowano 14 Lipca 2014 Udostępnij Opublikowano 14 Lipca 2014 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Zarchiwizowany
Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.