Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Unikalność rekordów
Forum PHP.pl > Forum > Bazy danych > MySQL
banana
witam,
mam tabelę (i nie może być ich więcej...) w której są
MIASTO|ULICA

NP:
KARAKÓW|KRAKOWSKA
KARAKÓW|WARSZAWASKA
KARAKÓW|ZIEMOWITA

WARSZAWA|KRAKOWSKA
WARSZAWA|WARSZAWASKA
WARSZAWA|PSZCZYŃSKA

ŁÓDŹ|KRAKOWSKA
ŁÓDŹ|WARSZAWASKA
ŁÓDŹ|ŁÓDZKA

chce wybrać powiedzmy 3 rekordy ze wszystkich, tak by miasto i ulica się nie powtarzały w wyniku zapytania
czyli naprzykład:

KARAKÓW|WARSZAWASKA
WARSZAWA|PSZCZYŃSKA
ŁÓDŹ|KRAKOWSKA

Chcę wybrać tylko unikalne rekordy zarówno pod względem miasta jak i ulicy,

próbuje grupować rekordy po mieście
  1. GROUP BY miasto
- ale wtedy jest szansa, że ulice będa takie same

dziękuję,

Banana
mortus
  1. SELECT DISTINCT `miasto`, `ulica` FROM `tabela`

albo
  1. SELECT `miasto`, `ulica` FROM `tabela` GROUP BY `miasto`, `ulica`

EDIT:
Nie wiem, czy kolega rozumie, co to jest unikalność rekordu. W podanym wyżej przykładzie każdy rekord jest unikalny, bo nie ma dwóch identycznych wartości zarówno w kolumnie `miasto`, jak i w kolumnie `ulica` jednocześnie.
banana
dziekuję za odpowiedź smile.gif
Cytat(mortus @ 28.03.2012, 10:47:30 ) *
Nie wiem, czy kolega rozumie, co to jest unikalność rekordu. W podanym wyżej przykładzie każdy rekord jest unikalny, bo nie ma dwóch identycznych wartości zarówno w kolumnie `miasto`, jak i w kolumnie `ulica` jednocześnie.

Chcę wybrać tylko unikalne rekordy zarówno pod względem miasta jak i ulicy

przepraszam może niezbyt wyraźnie to napisałem - poprawiłem opis, przy okazji czysty DISTINCT nie zadziała - sprawdzone, group by tak samo mi nie wychodzi...
markonix
Proponuje nadać indeks unikalny na pole miasto i ulica (jeden).
banana
Dziekuję za odpowiedź smile.gif
Cytat(markonix @ 28.03.2012, 11:16:25 ) *
Proponuje nadać indeks unikalny na pole miasto i ulica (jeden).

hm - niestety to nie możliwe - unikalne i incrementowalne jest id

ja mam w tabeli (w której nie mogę nic zmienić):
-miasta,ulicę, i firmę - która również może sie powtarzać (np. oddziały)
-wiadomo, każde miasto może mieć tak samo nazwana ulicę
-jeśli nadam unikalny indeks - nie będę mógł wprowadzić ponownie np. tego samego miasta...
mortus
Cytat(markonix @ 28.03.2012, 11:16:25 ) *
Proponuje nadać indeks unikalny na pole miasto i ulica (jeden).

A co ma piernik do wiatraka.
@banana: ty nie chcesz wybrać unikalnych rekordów pod względem zarówno miasta, jak i ulicy, ale chcesz wybrać takie ulice, które występują tylko w jednym mieście, a to zdecydowana różnica:
  1. SELECT `miasto`, `ulica` FROM `tabela` GROUP BY `ulica` HAVING COUNT(*) = 1
markonix
Dlatego mówiłem O JEDNYM KLUCZU PODWÓJNYM czyli na dwóch kolumnach jednocześnie MIASTO + ULICA. Same miasto i sama ulica może się powtarzać.
Kluczy może być dużo, tutaj chodzi o optymalizacje oraz o zabezpieczenie przed dublowaniem rekordów, które nie powinny być zdublowane.
banana
Dziękuję za odpowiedź smile.gif
w bazie nie ma zdublowanych rekordów miasto|ulica

ps. nadałem taki indeks smile.gif
alegorn
troche do bani podejscie, nie przemyslane.

nie przewidziales tego ze miasta nie sa unikatem w polsce, jest np. kilka warszaw smile.gif
czysto teoretycznie moga miec takie same ulice (choc jedna) i co wtedy?

zainteresuj sie bazami GUS (terc simc etc)

j.


edit index tez do bani, bo czy w bazie mozesz miec tylko jedna firme w jednym miescie przy jednej ulicy?? jesli juz, musisz zastosowac klucz zlozony, z wiekszej ilosci kolumn.
mortus
Cytat(mortus @ 28.03.2012, 11:33:52 ) *
@banana: ty nie chcesz wybrać unikalnych rekordów pod względem zarówno miasta, jak i ulicy, ale chcesz wybrać takie ulice, które występują tylko w jednym mieście, a to zdecydowana różnica

Po namyśle stwierdzam, że jednak nie o to Ci chodzi. Chodzi o to, że to wybrane (a nie przeszukiwane) rekordy mają być unikalne pod względem zarówno miasta, jak i ulicy. Nie wiem, czy napisanie takiego zapytania jest w ogóle możliwe, bo wiązałoby się to z wybraniem jednego rekordu, później wybraniem drugiego rekordu i porównywaniem obydwu wybranych pod względem `miasta` i `ulicy`. Nie jest to raczej możliwe przy wykorzystaniu zwykłych zapytań, a trzeba by było napisać funkcję/procedurę korzystającą m. in. z instrukcji warunkowych MySQL. Przy czym nawet napisanie takiej procedury nie zagwarantuje Ci, że otrzymane wyniki będą zadowalające... przecież kombinacji może być baaaardzo dużo (jeśli nie nieskończenie wiele), a wszystko odbywało by się po części w sposób losowy, tj. uzależniony od pewnych specyficznych ustawień/właściwości silnika baz danych.
markonix
Te kilka Warszaw to wsie czy wioski.
Jestem ciekaw czy faktycznie występuje taka sytuacja bo może urząd zajmujący się nadawaniem nazw ulic ma z góry założenie, że do takiej sytuacji nie może dojść.
Może nawet mają bazę z unikalnym kluczem wink.gif
banana
dziekuję za odp smile.gif
Cytat(alegorn @ 28.03.2012, 11:47:00 ) *
nie przewidziales tego ze miasta nie sa unikatem w polsce, jest np. kilka warszaw smile.gif
czysto teoretycznie moga miec takie same ulice (choc jedna) i co wtedy?

no właśnie tongue.gif (zdejmuję ten indeks smile.gif)

no ale pozostaje pytanie - czy da się?
mortus
Panowie, ale w ogóle nie ma o czym gadać. Weźmy przykład autora:
BAZA DANYCH
MIASTO|ULICA
KARAKÓW|KRAKOWSKA
KARAKÓW|WARSZAWASKA
KARAKÓW|ZIEMOWITA
WARSZAWA|KRAKOWSKA
WARSZAWA|WARSZAWASKA
WARSZAWA|PSZCZYŃSKA
ŁÓDŹ|KRAKOWSKA
ŁÓDŹ|WARSZAWASKA
ŁÓDŹ|ŁÓDZKA

Wynik jaki chce uzyskać autor:
KARAKÓW|WARSZAWASKA
WARSZAWA|PSZCZYŃSKA
ŁÓDŹ|KRAKOWSKA

Ale prawidłowym wynikiem będzie również:
KARAKÓW|KRAKOWSKA
WARSZAWA|WARSZAWASKA
ŁÓDŹ|ŁÓDZKA

Wątpię, aby jakikolwiek silnik bazodanowy poradził sobie z tym problemem, a wyniki będą całkowicie przypadkowe.
banana
Dzięki smile.gif
Cytat(mortus @ 28.03.2012, 11:49:00 ) *
Nie wiem, czy napisanie takiego zapytania jest w ogóle możliwe, bo wiązałoby się to z wybraniem jednego rekordu, później wybraniem drugiego rekordu i porównywaniem obydwu wybranych pod względem `miasta` i `ulicy`.


Wydaje sie, że na początek można wybrać np. 3 miasta
  1. GROUP BY miasto LIMIT 3
i do tych wyników dopasować selectem wewnętrznym ulice - ale jak - nie mam pomysłu - jedyna sprawa to php - tu raczej by się to udało - jednak 3 zapytania do bazy...

Dziękuję :|
Cytat(mortus @ 28.03.2012, 11:59:20 ) *
Wątpię, aby jakikolwiek silnik bazodanowy poradził sobie z tym problemem, a wyniki będą całkowicie przypadkowe.


rzeczywiście wyniki mogą być (na razie) przypadkowe i ja nie chcę (na razie) całej bazy łuskać w ten sposób tylko chciałbym wybrać 3 wyniki...
(oczywiście można je oznaczyć jako wybrane i nie będą brane pod uwagę przy nastepnym selekcie)
mortus
Tak, tylko co ma zadecydować o tym, jakie to będą miasta? Porządek sortowania ustalony przez system baz danych? Własne sortowanie? A co z miastami ze środka tabeli, jak je wybrać? Kombinacji może być naprawdę baaaaaaaaaaaaaardzo dużo. Załóżmy, że w pierwszym zapytaniu wybierzesz Kraków, Warszawę i Łódź. A dlaczego nie miały by to być np. Wrocław, Poznań, czy Gdańsk? Zauważ przy tym, że pozostałe wyniki (wyniki kolejnych zapytań) w obu przypadkach mogą się zdecydowanie różnić i mogą posiadać wiele kombinacji.

Doszukiwałbym się raczej błędu w założeniach projektu, aniżeli rozwiązania przedstawionego problemu.
Crozin
Da się przy pomocy czegoś takiego:
  1. SELECT o.* FROM (SELECT i.id, i.miasto, i.ulica FROM firmy AS i GROUP BY i.ulica) AS o GROUP BY o.miasto;
O ile wyniki powinny spełniać Twoje kryteria to jakie one będą same w sobie to już zupełnie inna bajka.
banana
Cytat(mortus @ 28.03.2012, 12:10:53 ) *
Tak, tylko co ma zadecydować o tym, jakie to będą miasta?

ok - to nie istotne - ale np. ważność można określać poprzez wielkość miasta/liczbe ludności - jesli to w czymś może pomóc...
czyli zaczynamy wibierać miasta od najwiekszększego, tą samą rolę może równiez spełniać ID rekordu wink.gif

Dziekuję
Cytat(Crozin @ 28.03.2012, 12:15:57 ) *
Da się przy pomocy czegoś takiego:
  1. SELECT o.* FROM (SELECT i.id, i.miasto, i.ulica FROM firmy AS i GROUP BY i.ulica) AS o GROUP BY o.miasto;
O ile wyniki powinny spełniać Twoje kryteria to jakie one będą same w sobie to już zupełnie inna bajka.

w zasadzie bardzo ok, gdyby można tu jeszcze regulować ilość wyników 3-5 to mogłoby być to wink.gif
Crozin
Dodaj na końcu LIMIT?
banana
tak dokładnie - smile.gif LIMIT
dziekuje wam bardzo - szczególnie Panu Crozin'owi smile.gif
temat można uważać za zamknięty
jeszcze raz dzięki!
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.