Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z zapytaniem SQL
Forum PHP.pl > Forum > Bazy danych > MySQL
piotrek693
Witam,

mam problem ze stworzeniem pewnego SELECTA w MySQL:

Mam tabelę:

id|nazwa|typ_ceny|cena
1| cos1 | 1 | 1,1
2| cos1 | 2 | 1,2
3| cos1 | 3 | 1,5
4| cos2 | 1 | 2,2
5| cos2 | 2 | 2,6
6| cos2 | 3 | 3,0

chcę otrzymać taki rezultat:

nazwa| cena1| cena2| cena3
cos1 |1,1 | 1,2 | 1,5
cos2 |2,2 | 2,6 | 3,0

Ktoś ma może pomysł jak to zrobić?

Jak nie w MySQL to może w MsSQL?

Pozdrawiam
wookieb
  1. SELECT nazwa, GROUP_CONCAT(cena SEPARATOR '|') AS ceny GROUP BY nazwa
piotrek693
dziękuję za odpowiedź ,ale wpisałem zapytanie:

  1. SELECT nazwa, GROUP_CONCAT(cena) AS ceny FROM cennik GROUP BY nazwa


niestety MySQL zwraca błąd 1064

po drugie chciałbym, żeby te ceny były zwrócone osobnych kolumnachtzn. jako cena1, cena2 i cena3



wookieb
Jeżeli chcesz w kolumnach to
1) Przebuduj tabelę na taką jaka powinna być (czyli dodać te kolumny ceny)
2) Zbudować bardziej rozbudowane zapytanie coś w stylu
  1. SELECT nazwa, cena AS cena1,
  2. (SELECT cena FROM cennik WHERE nazwa=a.nazwa LIMIT 1 OFFSET 1) AS cena2,
  3. (SELECT cena FROM cennik WHERE nazwa=a.nazwa LIMIT 1 OFFSET 2) AS cena3
  4. FROM cennik a GROUP BY nazwa

Ale nie polecam takiego rozwiązania
3) Rozbijać dane na kolumny z poziomu php (używają mojego zapytania)

Nabardziej polecam rozwiązanie 1
piotrek693
ad. 1 nie mogę przebudować bo to tabela programu opartego handlowego na SQL(oczywiście mój przyklad został uproszczony)

ad. 2 wpisałem:
  1. SELECT nazwa, cena AS cena1,
  2. (SELECT cena FROM cennik WHERE typ = 2) AS cena2,
  3. (SELECT cena FROM cennik WHERE typ = 3) AS cena3
  4. FROM cennik a WHERE typ = 1


do MSSQL i działa. Bardzo mi to pomoże. Pytanie tylko dlaczego nie polecasz takiego rozwiązania?

ad. 3 też o ty myślełem (funkcja chyba nazywa się explode) ale mój Mysql wyrzuca mi ten błąd 1064. Ciekawe może mam starą wersją serwera?

Tak czy inaczej BARDZO DZIĘKUJĘ, bo prakycznie mój problem został rozwiązany smile.gif
wookieb
2) Bo jego wydajność jest mierna. DO podzapytań musisz jeszcze przekazać aktualną nazwę (tak jak w moim przykładzie) bo inaczej będziesz mieć te same wyniki. W innych przypadkach nawet błąd.
3) Jaka wersja Mysql? I jeżeli poniżej 5 to nie możesz zrobić upgrade?
piotrek693
Masz rację, dokładnie ma to wyglądać:

SELECT nazwa, cena AS cena1,
(SELECT cena FROM cennik WHERE nazwa=a.nazwa typ = 2) AS cena2,
(SELECT cena FROM cennik WHERE nazwa=a.nazwa typ = 3) AS cena3
FROM cennik a where typ = 1

O wydajność zbytnio się nie martwię, ponieważ takie zapytanie będzie się wykonywało tylko raz dziennie w celu przerzucenia cen z programu handlowego do mysql.

Jeśli chodzi o wersję MySQL to wszystko jasne: 4.0.26. A, że pracuję na WebServ'ie to wypadałoby zmienić soft. Ciekawe, wiesz może co najlepiej spisuje się pod windowsem? Serwer nie ma dużego obciążenia, używany jest jedynie w sieci lokalnej...
wookieb
To zapytanie co dałeś na pewno działa? Bo wydaje mi się, że nie. Mysql 5 w zupełności Ci wystarczy.
piotrek693
Oryginalne zapytanie wygląda tak:

tylko, że tu są 3 tabele
TW-wyciągam id, kod nazwę i kod paskowy
CN- ceny ułożone tak jak w moim przykładzie, ale muszą być aktywne i typceny=2
SM- stany magazynowe-wyciągam stan i stan handlowy

  1. SELECT a.id, kod, nazwa, kodpaskowy, cena AS cenaA,
  2. (SELECT cena FROM CN WHERE idpm=a.id AND typ = 2 AND aktywna=1 AND typceny = 2) AS cenaB,
  3. (SELECT cena FROM CN WHERE idpm=a.id AND typ = 3 AND aktywna=1 AND typceny = 2) AS cenaC,
  4. sum(stan), sum(stanHandl)
  5. FROM TW a INNER JOIN CN ON a.id = CN.idpm
  6. LEFT JOIN SM ON a.id = SM.idtw
  7. WHERE CN.typ = 1 AND aktywna=1 AND typceny = 2
  8. GROUP BY a.id, kod, nazwa, kodpaskowy, cena, typceny


Może przy upraszczaniu coś źle pzepisałem, ale oryginalne zapytanie działa cacy
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.