Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Sortowanie wedlug innej tabeli
Forum PHP.pl > Forum > Przedszkole
ciekawskiii
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
nospor
SELECT po POKOJE
LEFT JOIN na POKOJE_ONLINE
GROUP BY Z POKOJE.ID
ORDER BY Z COUNT(POKOJE_ONLINE.ID)

smile.gif
ciekawskiii
Dzieki ale cos podobnego z left joinem juz sam probowalem i nie zwraca zadnych wynikow:S
nospor
Widac źle probowales smile.gif Kod co ci podałem jest dobry.
Pokaż swój
ciekawskiii
  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
nospor
no ale po LEFT JOIN należy podać jeszcze "ON zlączenie" smile.gif
ciekawskiii
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
nospor
A mi Twoje zapytanie działa.
Pokaż moze strukturę tabel oraz dane.

Zapytanie jest ok.
ciekawskiii
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?
nospor
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ć.
ciekawskiii
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.
nospor
Poproszę przykładowe dane z twojej bazy.
Najlepiej w postaci insertow, które skopiuje i wkleje do siebie. Podobnie ze strukturą tabel.
ciekawskiii
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
nospor
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
ciekawskiii
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
Valdi_B
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?
ciekawskiii
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
Valdi_B
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?
ciekawskiii
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
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.