Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] dublowanie, DISTINCT
Forum PHP.pl > Forum > Przedszkole
banki
Witam, mam takie zapytanie do bazy:

  1. $klient = mysql_query("select nazwa,rocznik,data,ile_sztuk from usluga where and data != '0' order by nazwa ");


chciałbym aby rekordy z kolumny nazwa, które mają taką samą nazwę nie wyświetlały się. Próbowałem z DISTINCT ale mi nie wychodziło.

w poniższym się zgadza, "nazwa" nie dublują się, ale potrzebuje też pobrać więcej danych z kolumn tym zapytaniem
  1. $klient = mysql_query("select DISTINCT nazwa from usluga where and data != '0' order by nazwa ");


z góry dzięki za pomoc
wookieb
  1. SELECT nazwa,rocznik,DATA,ile_sztuk FROM usluga WHERE AND DATA != '0' ORDER BY nazwa GROUP BY nazwa
banki
wywala błąd:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in engine.php on line 1270

w linii błędu jest:
  1. while ($klient2 = mysql_fetch_array($klient)) {



bez tego Group by wyświetla rekordy, lecz nie tak jak tego chcę
wookieb
No to wrzuć zapytanie do phpmyadmin i powiedz jaki wywali błąd.
banki
#1064 - Something is wrong in your syntax obok 'group by nazwa
LIMIT 0, 30' w linii 1
wookieb
  1. SELECT nazwa,rocznik,DATA,ile_sztuk FROM usluga WHERE DATA != '0' ORDER BY nazwa GROUP BY nazwa
skarabe.pl
@wookie: z tego co pamiętam, to klauzula ORDER BY musi być za klauzulą GROUP BY, to raz. A dwa, że takie zapytanie nie ma prawa zadziałać, bo w GROUP BY trzeba wymienić *wszystkie* kolumny, które nie są funkcjami grupującymi.

@banki: spróbuj tak:
  1. SELECT nazwa,rocznik,DATA,ile_sztuk FROM usluga u WHERE AND DATA != '0' AND DATA = (SELECT MAX(u2.DATA) FROM usluga u2 WHERE u2.nazwa = u.nazwa) ORDER BY nazwa

Ciut niewydajne, ale powinno wyciągnąć to co trzeba. Powiedz jeszcze na której (których) kolumnie (kolumnach) jest klucz główny?
wookieb
Cytat(skarabe.pl @ 29.07.2010, 11:12:31 ) *
@wookieb: z tego co pamiętam, to klauzula ORDER BY musi być za klauzulą GROUP BY, to raz.

Faktycznie źle testowałem
Cytat
A dwa, że takie zapytanie nie ma prawa zadziałać, bo w GROUP BY trzeba wymienić *wszystkie* kolumny, które nie są funkcjami grupującymi.

Tak jest w postgresie a nie mysql.
PS Twoje zapytanie właśnie nie działa smile.gif
zelu
Cytat(skarabe.pl @ 29.07.2010, 11:12:31 ) *
A dwa, że takie zapytanie nie ma prawa zadziałać, bo w GROUP BY trzeba wymienić *wszystkie* kolumny, które nie są funkcjami grupującymi.


Nie w MySQLu smile.gif W PostgreSQL owszem smile.gif

Cytat(skarabe.pl @ 29.07.2010, 11:12:31 ) *
  1. SELECT nazwa,rocznik,DATA,ile_sztuk FROM usluga u WHERE AND DATA != '0' AND DATA = (SELECT MAX(u2.DATA) FROM usluga u2 WHERE u2.nazwa = u.nazwa) ORDER BY nazwa

Ciut niewydajne, ale powinno wyciągnąć to co trzeba.


Ciut? smile.gif

Cytat(skarabe.pl @ 29.07.2010, 11:12:31 ) *
@wookie: z tego co pamiętam, to klauzula ORDER BY musi być za klauzulą GROUP BY, to raz.

A to się zgadza winksmiley.jpg

Pozdrawiam

skarabe.pl
Cytat(zelu @ 29.07.2010, 11:16:15 ) *
Nie w MySQLu :) W PostgreSQL owszem :)

Możliwe - niestety ostatnio mam mniej do czynienia z MySQL na rzecz Oracle, mogłem zapomnieć :( Przepraszam jeśli wprowadziłem w błąd.
Cytat(zelu @ 29.07.2010, 11:16:15 ) *
Ciut? :)

Ciut - jeśli indeksy są tam gdzie trzeba (stąd moje pytanie o klucz). Rozumiem, że w MySQL, zgodnie z tym co napisałeś wyżej, wystarczy zmienić kolejność klauzul w zapytaniu wookieb i będzie hulało? Jeśli tak, to oczywiście "this is the way to go" :)
banki
metodą prób i błędów doszedłem jak mogę zrobić to co chcę, Wasze uwagi też pomogły, lecz teraz jeszcze inny problem mam smile.gif


  1. SELECT nazwa,rocznik,DATA,ile_sztuk FROM usluga WHERE DATA != '0' ORDER BY nazwa GROUP BY nazwa


jeśli 2 wiersze się powtarzają, pokazuje tylko jeden, jest spoko ok

| nazwa |rocznik| data | ile_sztuk |
| nazwa1 | 1990 | 20.01.2001 | 20 |
| nazwa1 | 1990 | 20.01.2001 | 10 |
| nazwa2 | 1980 | 20.01.2001 | 20 |
| nazwa3 | 1982 | 20.01.2001 | 20 |


to jest taka tabelka, chciałbym teraz aby dane z kolumny ile_sztuk się zsumowały gdzie nazwa jest taka sama (ale dalej wyświetla się tylko raz "nazwa1" zamiast 2 razy. jeśli niejasno napisałem rozpisze raz jeszcze, ale chyba wiadomo o co chodzi
skarabe.pl
Cytat(banki @ 29.07.2010, 11:50:44 ) *
to jest taka tabelka, chciałbym teraz aby dane z kolumny ile_sztuk się zsumowały

Magiczną funkcją SQL do tego jest SUM(ile_sztuk), zamiast golego ile_sztuk.
banki
dobra sorki panowie za glupie pytanie, najpierw zapytalem potem odpaliłem google a znalazlem od razu, glupi moj blad.
dzieki za pomoc
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.