Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Nowa wersja MySql i zapytanie wykonuje się inaczej niz na starej wersji
Forum PHP.pl > Forum > Przedszkole
neo1986kk
  1. SELECT t.version FROM (SELECT * FROM products ORDER BY version DESC) t INNER JOIN product_types pt ON pt.GID=t.type INNER JOIN customers c ON
  2. t.client=c.GID GROUP BY t.client, t.number, t.type


Zapytanie nie bierze pod uwagę tego kawałka (Select * from products order by version DESC), a we wcześniejszych wersjach SQL działało poprawnie, moje pytanie brzmi czy coś się rzeczywiśćie zmieniło i czy jest jakieś wyjście z tej sytuacji?
Pyton_000
Ale żeś powiedział.... No to teraz muszę użyć magicznej kuli i dowiedzieć się jaką miałeś wcześniej wersje i jaką masz teraz... Ale na moje oko to wszystko jest poprawnie.
trueblue
Dlaczego komplikujesz zapytanie?

  1. SELECT t.version FROM products t INNER JOIN product_types pt ON pt.GID=t.type INNER JOIN customers c ON
  2. t.client=c.GID GROUP BY t.client, t.number, t.type
neo1986kk
Zainstalowalem nowego xamppa z mariaDB nie pamietam jaka wersje mialem wcześniej ale to bylo ze 3 lata wstecz. Zapytanie komplikuje dlatego ze chce pobrac tylko najnowsze wersje.
trueblue
Te 2 zapytania nie różnią się wynikiem, jeśli nie ma klauzuli LIMIT w podzapytaniu.
neo1986kk
Ale z limitem sciagnie mi tylko 1 rekord
trueblue
Z LIMIT ściągnie tyle rekordów ile zadasz.

W obecnej chwili (bez LIMIT), obydwa zapytania są dają ten sam wyniki. A sortowanie zakłada się na cały wynik, czyli w Twoim przypadku po GROUP BY.
neo1986kk
W takim razie masz jakiś pomysł jak takie zapytanie napisać?

  1.  
  2. SELECT t.GID FROM (SELECT * FROM products GROUP BY `client`, `number`, `type` ORDER BY `version` DESC) t INNER JOIN product_types pt ON pt.GID=t.type INNER JOIN customers c ON
  3. t.client=c.GID GROUP BY t.client, t.number, t.type


Wymyśliłem już coś takiego, żeby przeczesał już zgrupowane i żadnej poprawy

Dobra małymi krokami na konkretnym przykładzie

  1. SELECT * FROM products ORDER BY `version` DESC


pokazuje mi

GID | nazwa | nr | wersja
4000 | Woda gazowana| 35 | 4
1575 | Woda gazowana| 35 | 3
1232 | Woda gazowana| 35 | 2
13 | Woda gazowana| 35 | 1

ale

  1. SELECT * FROM products GROUP BY `client`, `number`, `type` ORDER BY `version` DESC


GID | nazwa | nr | wersja
1575 | Woda gazowana| 35 | 3

a powinno

GID | nazwa | nr | wersja
4000 | Woda gazowana| 35 | 4
trueblue
Wydaje mi się, że nie czytasz dokładnie postów.
Podałem Ci przykład w moim pierwszym poście. Podzapytanie nie jest potrzebne. Kolejność ustalasz na końcu.
neo1986kk
@trueblue - Twoje zapytanie również zwraca mi wersję 35/03 a nie 35/04
trueblue
Co dowodzi, że zapytania dają ten sam wynik.

Teraz podaj kawałek danych dla products, product_types, customers (podałeś tylko dla products i to z innymi nazwami kolumn niż w zapytaniu) i napisz jaki miałby być dla nich wynik.
neo1986kk
Tabela products

GID | name | type | number | version | client |

4001| Woda niegazowana| 1 |34 | 3 | 5984
4000 | Woda gazowana| 1 | 35 | 4 | 5984
1680| Woda niegazowana| 1 |34 | 2 | 5984
1575 | Woda gazowana| 1 |35 | 3 | 5984
1232 | Woda gazowana| 1 |35 | 2 | 5984
14| Woda niegazowana | 1 | 34 | 1 | 5984
13 | Woda gazowana | 1 | 35 | 1 | 5984


Tabela products_types

GID | type

1 | Butelka platikowa
2 | Butelka szklana

Tabela customers

GID | name |
1 | Coca cola HBC Polska
2 | Polska Woda Sp. z o.o.
5984 | Womir - Spa Sp. z o.o.


Chcę wydobyć tylko najwyższe wersje produktów czyli wynik powinien być taki

GID | name | type | number | version | client

4001| Woda niegazowana| Butelka plastikowa |34 | 3 | Womir - Spa Sp. z o.o.
4000 | Woda gazowana| Butelka plastikowa | 35 | 4 | Womir - Spa Sp. z o.o.

A dostaje coś takiego:

GID | name | type | number | version | client

4001| Woda niegazowana| Butelka plastikowa |34 | 3 | Womir - Spa Sp. z o.o.
1575 | Woda gazowana| Butelka plastikowa | 35 | 3 | Womir - Spa Sp. z o.o.
trueblue
  1. SELECT max(p.gid),p.client,p.number,p.type FROM products AS p
  2. INNER JOIN product_types pt ON pt.GID=p.type
  3. INNER JOIN customers c ON p.client=c.GID
  4. GROUP BY p.client, p.number, p.type


Przyjrzyj się dobrze, bo nie ma grupowania po version, a może powinno być.
neo1986kk
No dobra już wiem, tu jest inny wałek, Twoje zapytanie działa w ten sam sposób co moje tylko chyba trzeba będzie zmienić max (gid) na max(version) bo GID pobiera od wersji 4 a wyświetla, że to wersja 3, i to moje pierwsze zapytanie robiło to samo.


Edit:: max(version) to już w ogóle inne wyniki pokazuje, czyli coś jest nie tak z bazą? skoro pokazuje GID jest ok a przypisana do niego wersja nie pasuje:/

Edit:: dodałem do grupowania p.version to mi wyświetla teraz wszystkie wersje, ale przynajmniej przypisane odpowiednio do GID
trueblue
Cytat(trueblue @ 5.09.2016, 16:55:11 ) *
Przyjrzyj się dobrze, bo nie ma grupowania po version, a może powinno być.

Powodzenia!
neo1986kk
No właśnie to dopisałem, nic no dzięki za chęci, jakoś sobie poradzę...

Dobra udało się :

  1. SELECT max(p.gid),c.name, p.name, p.number, max(p.version), p.type FROM products AS p
  2. INNER JOIN product_types pt ON pt.GID=p.type
  3. INNER JOIN customers c ON p.client=c.GID
  4. GROUP BY p.client, p.number, p.type


Dzięki
trueblue
Źle.
Sprawdź co by było gdyby produkt 4001 lub 4000 miał version=1.
Trudno mi jest Ci pomóc, bo nie do końca wiem jaką zasadą kierować się przy wybieraniu tych rekordów.
Taki wynik można uzyskać również wybierając wszystkie produkty według malejącego GID i LIMIT 0,2, ale może Ty chcesz wyciągnąć jakieś top z grupy.
neo1986kk
Dokładnie. Chcę wyciągnąć top. mam 5000 produktów, które po prostu dostają nowe wersje i zawsze chcę pobierać najnowszą wersję produktu, a w SQL nie zmienia się nic oprócz pola version w tabeli na przykład z 2 na 3, ale wersję 2 też muszę trzymać w bazie
trueblue
Grupowanie względem number (zakładam, że to id produktu).
Z każdej grupy wybrana najwyższa wersja.

  1. SELECT
  2. SUBSTRING_INDEX(GROUP_CONCAT(p.GID ORDER BY p.version DESC),',',1),
  3. SUBSTRING_INDEX(GROUP_CONCAT(p.name ORDER BY p.version DESC),',',1),
  4. SUBSTRING_INDEX(GROUP_CONCAT(p.version ORDER BY p.version DESC),',',1)
  5. FROM products AS p
  6. INNER JOIN product_types pt ON pt.GID=p.type
  7. INNER JOIN customers c ON p.client=c.GID
  8. GROUP BY p.number
neo1986kk
To zapytanie zwraca mi 901 wyników, a powinno 4725. Druga sprawa jest taka, że dla niektórych produktów wersja jest równa 0, a takie produkty nie istnieją.

Edit: To chyba trzeba będzie zrobić dwoma zapytaniami. Najpierw wybrać najwyższe GID, a potem drugim zapytaniem resztę cech produktu.
trueblue
Nie zakładałbym, że czym wyższy GID, to tym wyższa wersja produktu. Może masz tak w przypadku 100%, ale...


Względem czego ma być wybrana najwyższa wersja? Produktu? Jest, ale wspominałem, że number uznaję za unikalny identyfikator produktu. Produktu i producenta? To trzeba dodać grupowanie po p.client - będziesz mieć więcej rekordów.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.