Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Nowa wersja MySql i zapytanie wykonuje się inaczej niz na starej wersji
neo1986kk
post
Post #1





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

Ostrzeżenie: (0%)
-----


  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?
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 20)
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post
Post #3





Grupa: Zarejestrowani
Postów: 6 807
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
neo1986kk
post
Post #4





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post
Post #5





Grupa: Zarejestrowani
Postów: 6 807
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Te 2 zapytania nie różnią się wynikiem, jeśli nie ma klauzuli LIMIT w podzapytaniu.
Go to the top of the page
+Quote Post
neo1986kk
post
Post #6





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

Ostrzeżenie: (0%)
-----


Ale z limitem sciagnie mi tylko 1 rekord
Go to the top of the page
+Quote Post
trueblue
post
Post #7





Grupa: Zarejestrowani
Postów: 6 807
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
neo1986kk
post
Post #8





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

Ostrzeżenie: (0%)
-----


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


Ten post edytował neo1986kk 5.09.2016, 14:33:00
Go to the top of the page
+Quote Post
trueblue
post
Post #9





Grupa: Zarejestrowani
Postów: 6 807
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
neo1986kk
post
Post #10





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

Ostrzeżenie: (0%)
-----


@trueblue - Twoje zapytanie również zwraca mi wersję 35/03 a nie 35/04
Go to the top of the page
+Quote Post
trueblue
post
Post #11





Grupa: Zarejestrowani
Postów: 6 807
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
neo1986kk
post
Post #12





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post
Post #13





Grupa: Zarejestrowani
Postów: 6 807
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  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ć.
Go to the top of the page
+Quote Post
neo1986kk
post
Post #14





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował neo1986kk 5.09.2016, 16:34:32
Go to the top of the page
+Quote Post
trueblue
post
Post #15





Grupa: Zarejestrowani
Postów: 6 807
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Cytat(trueblue @ 5.09.2016, 16:55:11 ) *
Przyjrzyj się dobrze, bo nie ma grupowania po version, a może powinno być.

Powodzenia!
Go to the top of the page
+Quote Post
neo1986kk
post
Post #16





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował neo1986kk 5.09.2016, 16:41:14
Go to the top of the page
+Quote Post
trueblue
post
Post #17





Grupa: Zarejestrowani
Postów: 6 807
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Ź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.
Go to the top of the page
+Quote Post
neo1986kk
post
Post #18





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
trueblue
post
Post #19





Grupa: Zarejestrowani
Postów: 6 807
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
neo1986kk
post
Post #20





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

Ostrzeżenie: (0%)
-----


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.

Ten post edytował neo1986kk 6.09.2016, 10:15:12
Go to the top of the page
+Quote Post
trueblue
post
Post #21





Grupa: Zarejestrowani
Postów: 6 807
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 15:47