Temat: [MySQL] Losowy rekord

Mam takie zapytanie:

SELECT
m.id,
n.nazwa miejscowosc,
o.id,
o.nazwa
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
GROUP BY m.id;

Problem polega na tym, że rekord z tabeli obiekty powinien być losowy. Próbowałem już na milion sposobów, z użyciem podzapytan itd, ale bez efektów... Liczę na Waszą pomoc i z góry dzięki ;)
Marcin Domasławski

Marcin Domasławski Software Developer

Temat: [MySQL] Losowy rekord

ON o.miejscowosc = m.id ? na pewno tak ? nie próbujesz czasem łączyć id z tabeli ze stringiem nazwy ?

Pomijając to, jest coś takiego jak rand() - można spróbować z np. FLOOR( MAX(id) * RAND() ) ale jeśli baza jest bardzo duża to będzie to kat dla wydajności ;-)

Temat: [MySQL] Losowy rekord

Pole 'miejscowosc' sluzy wlasnie do relacji z tabela miejscowosci. Jest to klucz obcy, czyli int.

Twoje rozwiazanie odnosnie zastapienia RAND() przez FLOOR(MAX(id) * RAND()) tez nie jest idealne - w przypadku, gdy rekordy beda usuwane pojawia sie "dziury" w bazie i moze zdarzyc sie zwrocenie pustego rekordu...
Waldemar Jonik

Waldemar Jonik właściciel,
webmaster,
programista, JW Web
Development

Temat: [MySQL] Losowy rekord

wystarczy dac na koncu ORDER BY RAND() powinno wystarczyc, mozna jeszcze dodac LIMIT 0,1 aby pobrac tylko 1 rekord

Temat: [MySQL] Losowy rekord

Waldemar Jonik:
wystarczy dac na koncu ORDER BY RAND() powinno wystarczyc, mozna jeszcze dodac LIMIT 0,1 aby pobrac tylko 1 rekord

Niestety nie - najpierw następuje grupowanie, dopiero później sortowanie (konstrukcja zapytania wymaga najpierw użycia GROUP BY a następnie ORDER BY). Po zgrupowaniu nie ma już czego sortować... ;)
Waldemar Jonik

Waldemar Jonik właściciel,
webmaster,
programista, JW Web
Development

Temat: [MySQL] Losowy rekord

tak rzeczywiscie, nie dozytalem ze chodzi o tasbele obiekty.

moze najlatwiej rozbic to na 2 osobne zapytania?

Temat: [MySQL] Losowy rekord

Waldemar Jonik:
moze najlatwiej rozbic to na 2 osobne zapytania?

Pewnie i tak, ale nie o to chodzi ;) Poza tym to nie byłyby 2 zapytania, a około 30...

konto usunięte

Temat: [MySQL] Losowy rekord

Bartłomiej Rosiński:
Waldemar Jonik:
moze najlatwiej rozbic to na 2 osobne zapytania?

Pewnie i tak, ale nie o to chodzi ;) Poza tym to nie byłyby 2 zapytania, a około 30...

Ad 1.
Bartek:
Jeżeli nie napiszesz o co chodzi dokładnie to dlaczego spodziewasz się trafnej odpowiedzi? Swoją drogą zastanawia mnie czemu nie użyjesz google http://www.google.pl/search?hl=pl&q=random+order+mySQL

Ad 2.
Starczy LIMIT 1;

Ad 3.
FLOOR( MAX(id) * RAND() ) Może się czasami przydać ;)
--
Pozdrawiam
Rafał.

Temat: [MySQL] Losowy rekord

Ad 1:
Chodzi o to:
Mam 3 tabele:
miejscowosci
miejscowosci_nazwa
obiekty

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.

Zapytanie, ktore podalem w pierwszym poscie powinno wyjasnic nieco mechanizm dzialania.

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

Ad 2:
Jeśli byłbyś tak miły i poparł to jakimś przykładem to byłbym bardzo wdzięczny ;)
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: [MySQL] Losowy rekord

SELECT
m.id,
n.nazwa miejscowosc,
o.id,
o.nazwa
FROM
(SELECT id FROM miejscowosci ORDER BY rand() LIMIT 1) as 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
GROUP BY m.id;

.. napisałem posta zanim wyjaśniłeś co chcesz zrobić ;-)Przemek Szalko edytował(a) ten post dnia 21.06.08 o godzinie 18:58

Temat: [MySQL] Losowy rekord

Przemek Szalko:
.. napisałem posta zanim wyjaśniłeś co chcesz zrobić
hehe :) faktycznie nie o to chodziło ;)

Temat: [MySQL] Losowy rekord

Zrobiłem nawet takiego tasiemnca:
SELECT m.id, n.nazwa miejscowosc, o.id, o.nazwa
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
AND o.id = (
SELECT id
FROM obiekty
WHERE miejscowosc = m.id
ORDER BY RAND( )
LIMIT 1 )
GROUP BY m.id;

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

EDIT:
Kolejny tasiemiec do kolekcji:
SELECT
n.nazwa,
m.id,
o.id,
o.nazwa
FROM
miejscowosci m LEFT JOIN miejscowosci_nazwa n ON n.m_id = m.id AND n.j_id = '1', obiekty o
WHERE
o.id = (SELECT id FROM obiekty WHERE miejscowosc = m.id ORDER BY RAND() LIMIT 1)
GROUP BY
m.id

Tym razem albo zwraca miejscowosc z losowym obiektem z tej miejscowosci, albo w ogole nie zwraca miejscowosci (pewnie to przez WHERE)Bartłomiej Rosiński edytował(a) ten post dnia 21.06.08 o godzinie 19:56

Następna dyskusja:

Zapytanie MySQL




Wyślij zaproszenie do