Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][mysql] Sortowanie wedlug innej tabeli
ciekawskiii
post
Post #1





Grupa: Zarejestrowani
Postów: 467
Pomógł: 39
Dołączył: 7.11.2010
Skąd: Raz tu, raz tam

Ostrzeżenie: (30%)
XX---


Witam, musze pierwszy raz w zyciu prosic o pomoc bo juz nie mam do tego cierpliwosci, co znalazlem to mi niewiele pomoglo i nie bardzo kumam co i jak wiec prosze o gotowy przyklad:p Mam tabele: pokoje (id, nazwa) i pokoje_online (id, id_pokoju, id_kto) i potrzebuje posortowac pokoje wedlug ilosci osob z tabeli pokoje_online, jednak jak w pokoju bedzie 0 wynikow to tez ma je wyswietlic, z gory dzieki


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 18)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




SELECT po POKOJE
LEFT JOIN na POKOJE_ONLINE
GROUP BY Z POKOJE.ID
ORDER BY Z COUNT(POKOJE_ONLINE.ID)

smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ciekawskiii
post
Post #3





Grupa: Zarejestrowani
Postów: 467
Pomógł: 39
Dołączył: 7.11.2010
Skąd: Raz tu, raz tam

Ostrzeżenie: (30%)
XX---


Dzieki ale cos podobnego z left joinem juz sam probowalem i nie zwraca zadnych wynikow:S


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





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Widac źle probowales smile.gif Kod co ci podałem jest dobry.
Pokaż swój


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ciekawskiii
post
Post #5





Grupa: Zarejestrowani
Postów: 467
Pomógł: 39
Dołączył: 7.11.2010
Skąd: Raz tu, raz tam

Ostrzeżenie: (30%)
XX---


  1. SELECT * FROM pokoje LEFT JOIN pokoje_online GROUP BY pokoje.id ORDER BY COUNT(pokoje_online.id_pokoj), pokoje.id DESC
no i wyswietla gdy dam sortowanie bez count() i w tym wlasnie problem, probowalem tez z inner join i as ale bez efektow, pierwszy raz mnie cos przeroslo:D


--------------------
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




no ale po LEFT JOIN należy podać jeszcze "ON zlączenie" smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ciekawskiii
post
Post #7





Grupa: Zarejestrowani
Postów: 467
Pomógł: 39
Dołączył: 7.11.2010
Skąd: Raz tu, raz tam

Ostrzeżenie: (30%)
XX---


Tez juz mialem ale zawsze zero wynikow gdy jest count(). Juz probowalem chyba wszystkiego, takie cos tez nic nie daje
  1. SELECT a.id, b.id_pokoj FROM pokoje a LEFT JOIN pokoje_online b ON a.id=b.id_pokoj GROUP BY a.id ORDER BY COUNT(b.id_pokoj), a.id DESC


Ten post edytował ciekawskiii 19.02.2011, 13:03:38


--------------------
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




A mi Twoje zapytanie działa.
Pokaż moze strukturę tabel oraz dane.

Zapytanie jest ok.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ciekawskiii
post
Post #9





Grupa: Zarejestrowani
Postów: 467
Pomógł: 39
Dołączył: 7.11.2010
Skąd: Raz tu, raz tam

Ostrzeżenie: (30%)
XX---


Wszystkie pola id mam typu int, w tabeli pokoje mam jeszcze pole nazwa typu varchar i mam 3 pokoje w tej tabeli, czat dziala wiec baza raczej nie ma nic do tego. Kiedys z tym count tez sie bawilem i tez wtedy nie dzialalo, moze chodzi o typ int?


--------------------
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Czego nie zrozumiałeś w zdaniu:
"Pokaż moze strukturę tabel oraz dane."
?

Powtarzam: zapytanie jest ok. Wstawiłem dokładnie Twoje zapytanie do moich danych testowych - działa.
Może więc coś jest z Twoją tabelą i Twoimi danymi - nie wiem, nie chcesz tego pokazać.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ciekawskiii
post
Post #11





Grupa: Zarejestrowani
Postów: 467
Pomógł: 39
Dołączył: 7.11.2010
Skąd: Raz tu, raz tam

Ostrzeżenie: (30%)
XX---


tabela pokoje:
id | nazwa
1 | pierwszy
2 | drugi
3 | trzeci
Tabela pokoje_online:
id | id_pokoj | id_kto | czas
Wszystkie pola id to int a nazwa i czas to varchar.

Ten post edytował ciekawskiii 19.02.2011, 13:47:12


--------------------
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Poproszę przykładowe dane z twojej bazy.
Najlepiej w postaci insertow, które skopiuje i wkleje do siebie. Podobnie ze strukturą tabel.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ciekawskiii
post
Post #13





Grupa: Zarejestrowani
Postów: 467
Pomógł: 39
Dołączył: 7.11.2010
Skąd: Raz tu, raz tam

Ostrzeżenie: (30%)
XX---


Tylko w jakim celu? Ja tez powtarzam ze czat dziala, mam w kazdym pokoju podglad osob w danym pokoju, mam trzecia tabele z postami w danym pokoju i wszystko dziala wiec to nie ma nic do rzeczy


--------------------
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Czy chat operuje na zapytaniu co podales? Nie, więc działa tongue.gif

Powtarzam po raz ostatni: zapytanie jest ok. Dla pewnosci wykonałem je na moich danych testowych - działa.
Tyle mam do powiedzenia. Skoro nie chcesz pomocy już w tej kwesti to kończymy temat smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ciekawskiii
post
Post #15





Grupa: Zarejestrowani
Postów: 467
Pomógł: 39
Dołączył: 7.11.2010
Skąd: Raz tu, raz tam

Ostrzeżenie: (30%)
XX---


Nie, ale dowodzi, ze tabele sa w porzadku a dane zapisywane sa prawidlowo. Zapytanie fakt, dziala ale bez sortowania count(b.id_pokoj) tyle, ze to ja juz wiedzialem zanim zalozylem temat


--------------------
Go to the top of the page
+Quote Post
Valdi_B
post
Post #16





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

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


Cytat(ciekawskiii @ 19.02.2011, 12:50:26 ) *
  1. SELECT a.id, b.id_pokoj FROM pokoje a LEFT JOIN pokoje_online b ON a.id=b.id_pokoj GROUP BY a.id ORDER BY COUNT(b.id_pokoj), a.id DESC


Na samym początku tego wątku napisałeś, że interesuje Cię liczba osób w danym pokoju.
Dlatego z tabeli pokoje_online (czyli "b") odczytuj nie "gołe" b.id_pokoj, ale count(b.id_pokoj).

Reasumując, zmień kwerendę na:

  1. SELECT a.id, count(b.id_pokoj) AS liczba
  2. FROM pokoje a LEFT JOIN pokoje_online b
  3. ON a.id=b.id_pokoj GROUP BY a.id
  4. ORDER BY COUNT(b.id_pokoj), a.id DESC


Różnica jest taka, że w pierwotnej redakcji za pokoje, które nie miały korespondujących rekordów w pokoje_online Twoja kwerenda zwraca NULL, natomiast powyższa kwerenda (z count(...)) zwraca 0.

Sprawdź np. pod phpMyAdmin'em - u mnie chodzi, oczywiście sam odczyt z bazy danych.

A może skrypt na Twojej stronie nie reaguje poprawnie, gdy z bazy dostanie wartość NULL?
Go to the top of the page
+Quote Post
ciekawskiii
post
Post #17





Grupa: Zarejestrowani
Postów: 467
Pomógł: 39
Dołączył: 7.11.2010
Skąd: Raz tu, raz tam

Ostrzeżenie: (30%)
XX---


Cos podobnego wlasnie z AS juz probowalem (ORDER BY liczba chyba?) tak czy inaczej, teraz dalej zero wynikow czy w pokoju ktos jest czy nie.
Dzieki valdi, zadzialalo z ORDER BY liczba DESC

Ten post edytował ciekawskiii 19.02.2011, 16:11:51


--------------------
Go to the top of the page
+Quote Post
Valdi_B
post
Post #18





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

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


Cytat(ciekawskiii @ 19.02.2011, 15:55:34 ) *
Cos podobnego wlasnie z AS juz probowalem (ORDER BY liczba chyba?) tak czy inaczej, teraz dalej zero wynikow czy w pokoju ktos jest czy nie

Rzeczywiście, w ORDER BY może być "liczba" (jest czytelniej).

A co do "zerowych" wyników: Czy wartości w polu pokoje_online.id_pokoj mają swoje "odpowiedniki" w tabeli "pokoje"?
Inaczej - czy dane w pokoje_online odwołują się do istniejących rekordów w tabeli pokoje?

Nawiasem mówiąc, zabezpieczeniem aby tak było jest zdefiniowanie FOREIGN KEY w pokoje_online.
Robiąc testy dot. Twojego przypadku zdefiniowałem tabelę następująco:
  1. CREATE TABLE `pokoje_online` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `id_pokoj` int(11) NOT NULL,
  4. `id_kto` int(11) NOT NULL,
  5. PRIMARY KEY (`id`),
  6. KEY `id_pok` (`id_pokoj`),
  7. CONSTRAINT `p_ponl`
  8. FOREIGN KEY (`id_pokoj`)
  9. REFERENCES pokoje (`id`)
  10. ) ENGINE=InnoDB;

Wówczas sama baza danych nie dopuści do wstawienia do pokoje_online odwołań do nieistniejących pokoi.

Wykonaj taką kwerendę:
  1. SELECT * FROM pokoje LEFT JOIN pokoje_online
  2. ON pokoje.id=pokoje_online.id_pokoj;

Dostaniesz w wyniku dane, które podana przez Ciebie kwerenda próbuje pogrupować.
Zobaczysz co "wyciągasz" z bazy (dane niezgrupowane).
Może to będzie dla Ciebie jakiś ślad co jest źle?

Ten post edytował Valdi_B 19.02.2011, 16:28:00
Go to the top of the page
+Quote Post
ciekawskiii
post
Post #19





Grupa: Zarejestrowani
Postów: 467
Pomógł: 39
Dołączył: 7.11.2010
Skąd: Raz tu, raz tam

Ostrzeżenie: (30%)
XX---


Valdi wielkie dzieki za chec pomocy ale juz dziala tak jak chcialem, w tym zapytaniu z Twojego pierwszego posta wkradla mi sie literowka a jak poprawilem i dalem samo sortowanie wedlug liczby to wszystko gra, nigdy nie uzywalem tego foreign key ale w tym przypadku raczej nie ma potrzeby;) jeszcze raz dzieki


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 20:32