Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Losowy rekord
Bartol
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 7.08.2004
Skąd: Tomaszów Maz.

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


Wątek na ten temat założyłem już na goldenline, niestety nie otrzymałem pomocy... (http://www.goldenline.pl/forum/bazy-danych/397748)

Napiszę w skrócie o co chodzi:
Mam takie zapytanie:
  1. SELECT
  2. m.id,
  3. n.nazwa miejscowosc,
  4. o.id,
  5. o.nazwa
  6. FROM miejscowosci m LEFT JOIN miejscowosci_nazwa n ON n.m_id = m.id AND n.j_id = '1' LEFT JOIN obiekty o ON o.miejscowosc = m.id
  7. GROUP BY m.id;


Chce z kazdej miejscowosci wyciagnac losowy obiekt. Nazwy miejscowosci przechowywane sa w drugiej tabeli (miejscowosci_nazwa) ze wzgledu na rozne nazewnictwo przy roznych wersjach jezykowych.

Problem polega na tym, ze nie wyciaga mi losowego obiektu, tylko zawsze pierwszy, ktory jest dodany do danej miejscowosci.

Podaje też kilka innych tasiemców, których próbowałem...:
  1. SELECT m.id, n.nazwa miejscowosc, o.id, o.nazwa
  2. FROM miejscowosci m
  3. LEFT JOIN miejscowosci_nazwa n ON n.m_id = m.id AND n.j_id = '1'
  4. LEFT JOIN obiekty o ON o.miejscowosc = m.id AND o.id = (
  5. SELECT id
  6. FROM obiekty WHERE miejscowosc = m.id
  7. ORDER BY RAND( )
  8. LIMIT 1 )
  9. GROUP BY m.id;


Działa prawie dobrze. Zwraca losowe obiekty przypisane do każdej miejscowości, ale czasami zamiast obiektu zwraca null...

Kolejny tasiemiec do kolekcji:
  1. SELECT
  2. n.nazwa,
  3. m.id,
  4. o.id,
  5. o.nazwa
  6. FROM miejscowosci m LEFT JOIN miejscowosci_nazwa n ON n.m_id = m.id AND n.j_id = '1', obiekty o
  7. WHERE o.id = (SELECT id FROM obiekty WHERE miejscowosc = m.id ORDER BY RAND() LIMIT 1 )
  8. GROUP BY
  9. m.id


Tym razem albo zwraca miejscowosc z losowym obiektem z tej miejscowosci, albo w ogole nie zwraca miejscowosci (pewnie to przez WHERE)

Ten post edytował Bartol 21.06.2008, 19:09:52
Go to the top of the page
+Quote Post
wipo
post
Post #2





Grupa: Zarejestrowani
Postów: 856
Pomógł: 19
Dołączył: 30.08.2005
Skąd: 100lica

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


Jak nie chcesz mieć null to dołączaj tabele samym join (left join połączy tablice nawet jak warunek połączenia nie jest spełniony)


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





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 7.08.2004
Skąd: Tomaszów Maz.

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


Cytat(wipo @ 22.06.2008, 16:48:23 ) *
Jak nie chcesz mieć null to dołączaj tabele samym join (left join połączy tablice nawet jak warunek połączenia nie jest spełniony)

Przy samym JOIN efekt jest identyczny...
Go to the top of the page
+Quote Post
wipo
post
Post #4





Grupa: Zarejestrowani
Postów: 856
Pomógł: 19
Dołączył: 30.08.2005
Skąd: 100lica

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


  1. SELECT m.id, n.nazwa miejscowosc, o.id, o.nazwa
  2. FROM miejscowosci m
  3. LEFT JOIN miejscowosci_nazwa n ON n.m_id = m.id AND n.j_id = '1'
  4. LEFT JOIN obiekty o ON o.miejscowosc = m.id AND o.id = (
  5. SELECT id
  6. FROM obiekty WHERE miejscowosc = m.id
  7. ORDER BY RAND( )
  8. LIMIT 1 ) WHERE o.nazwa NOT NULL
  9. GROUP BY m.id;


pozatym zobacz czy w tablicach z obiektami nie masz przypadkiem jakiegos nulla


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





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 7.08.2004
Skąd: Tomaszów Maz.

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


Cytat(wipo @ 23.06.2008, 04:37:36 ) *
  1. SELECT m.id, n.nazwa miejscowosc, o.id, o.nazwa
  2. FROM miejscowosci m
  3. LEFT JOIN miejscowosci_nazwa n ON n.m_id = m.id AND n.j_id = '1'
  4. LEFT JOIN obiekty o ON o.miejscowosc = m.id AND o.id = (
  5. SELECT id
  6. FROM obiekty WHERE miejscowosc = m.id
  7. ORDER BY RAND( )
  8. LIMIT 1 ) WHERE o.nazwa NOT NULL
  9. GROUP BY m.id;


pozatym zobacz czy w tablicach z obiektami nie masz przypadkiem jakiegos nulla

Nie ma żadnego nulla na pewno, są tylko testowe dane, dosłownie kilka rekordów.

Twój przykład działa podobnie jak jeden z moich. Poniżej wynik działania dla kilku odświeżeń:
Cytat
id miejscowosc id nazwa
1 Zakopane 1 u antka
2 Testowa 3 dupaaa1

id miejscowosc id nazwa
2 Testowa 3 dupaaa1

id miejscowosc id nazwa
1 Zakopane 2 u zdzicha

NULL

id miejscowosc id nazwa
1 Zakopane 1 u antka
2 Testowa 4 dupa2


Przypisania obiektów do miejscowości i ich losowość są w porządku. Problem polega na tym, że czasami opuszcza miejscowość/ci nie wiadomo czemu i nie uwzględnia ich w ogóle w wynikach.
Go to the top of the page
+Quote Post
wipo
post
Post #6





Grupa: Zarejestrowani
Postów: 856
Pomógł: 19
Dołączył: 30.08.2005
Skąd: 100lica

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


jestes pewnien ze to jest prawidlowe?
  1. LEFT JOIN obiekty o ON o.miejscowosc = m.id AND

w warunku porównujesz stringa z liczbami
po drugie jak nie znajduje miejscowosci (daje null) to moze dodaj
  1. WHERE n.nazwa miejscowosci NOT NULL


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





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 7.08.2004
Skąd: Tomaszów Maz.

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


Cytat(wipo @ 23.06.2008, 09:55:30 ) *
jestes pewnien ze to jest prawidlowe?
  1. LEFT JOIN obiekty o ON o.miejscowosc = m.id AND

w warunku porównujesz stringa z liczbami

Jestem pewien. o.miejscowosc jest typu int.
Cytat(wipo @ 23.06.2008, 09:55:30 ) *
po drugie jak nie znajduje miejscowosci (daje null) to moze dodaj
  1. WHERE n.nazwa miejscowosci NOT NULL

zaraz poprobuje
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 - 14:42