Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z zapytaniem SQL
piotrek693
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 12.11.2010

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


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





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. SELECT nazwa, GROUP_CONCAT(cena SEPARATOR '|') AS ceny GROUP BY nazwa
Go to the top of the page
+Quote Post
piotrek693
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 12.11.2010

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


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



Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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

Ten post edytował wookieb 12.11.2010, 16:47:53
Go to the top of the page
+Quote Post
piotrek693
post
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 12.11.2010

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


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
wookieb
post
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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?

Ten post edytował wookieb 12.11.2010, 18:38:17
Go to the top of the page
+Quote Post
piotrek693
post
Post #7





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 12.11.2010

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


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





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




To zapytanie co dałeś na pewno działa? Bo wydaje mi się, że nie. Mysql 5 w zupełności Ci wystarczy.
Go to the top of the page
+Quote Post
piotrek693
post
Post #9





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 12.11.2010

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


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

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: 22.08.2025 - 18:55