Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skomplikowane zapytanie
Forum PHP.pl > Forum > Bazy danych > MySQL
llukasz
Witam.

Mam takie nieco chaotyczne zapytanie:

  1. SELECT n.*, k.*, k1.* FROM newsy n, newsy_kategorie k, newsy_kategorie k1 WHERE (n.aktywny=1 AND n.glowna=1 AND n.archiwum=0) AND (n.kategoria=0 OR ((k.id=n.kategoria AND k.aktywna=1) AND (k.kategoria=0 OR (k1.id=k.kategoria AND k1.aktywna=1))))


Na język ludzki chodzi o to:

Mam pole z newsem, przypisanym do jakiejś kategorii, najpierw sprawdzam czy w ogóle news ma być publikowany (opcje aktywny, glowna i archiwum) jak tak patrzę czy kategoria do której jest przypisany ma opcję aktywny uruchomioną (jeśli nie został przypisany do kategorii na tym sprawdzanie się kończy), gdy ma patrzę czy kategoria nadrzędna jest aktywna, i na tym ten łańcuch się kończy, chce pobrać wszystkie newsy spełniające te kryteria, a także wszystkie opcje kategorii (jeśli przypisano) i kategorii nadrzędnej (też jeśli przypisano) każdego newsa żeby jeszcze inne opcje później z nich wykorzystać...


Jego wynik jest taki (w bazie jest zapisany akurat tylko jeden rekord spełniający kryteria):

CODE
Array
(
[0] => Array
(
[id] => 6
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 0
[archiwum] => 0
[nazwa] => Kategoria3
[aktywna] => 1
)

[1] => Array
(
[id] => 6
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 0
[archiwum] => 0
[nazwa] => Kategoria3
[aktywna] => 1
)

[2] => Array
(
[id] => 6
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 0
[archiwum] => 0
[nazwa] => Kategoria3
[aktywna] => 1
)

[3] => Array
(
[id] => 6
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 0
[archiwum] => 0
[nazwa] => Kategoria3
[aktywna] => 1
)

[4] => Array
(
[id] => 4
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 0
[archiwum] => 0
[nazwa] => Kategoria1
[aktywna] => 1
)

[5] => Array
(
[id] => 4
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 0
[archiwum] => 0
[nazwa] => Kategoria1
[aktywna] => 1
)

[6] => Array
(
[id] => 4
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 0
[archiwum] => 0
[nazwa] => Kategoria1
[aktywna] => 1
)

[7] => Array
(
[id] => 4
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT


[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 0
[archiwum] => 0
[nazwa] => Kategoria1
[aktywna] => 1
)

[8] => Array
(
[id] => 7
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 4
[archiwum] => 0
[nazwa] => Kategoria2
[aktywna] => 1
)

[9] => Array
(
[id] => 7
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 4
[archiwum] => 0
[nazwa] => Kategoria2
[aktywna] => 1
)

[10] => Array
(
[id] => 7
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 4
[archiwum] => 0
[nazwa] => Kategoria2
[aktywna] => 1
)

[11] => Array
(
[id] => 7
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 4
[archiwum] => 0
[nazwa] => Kategoria2
[aktywna] => 1
)

[12] => Array
(
[id] => 8
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 4
[archiwum] => 0
[nazwa] => Kategoria4
[aktywna] => 1
)

[13] => Array
(
[id] => 8
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 4
[archiwum] => 0
[nazwa] => Kategoria4
[aktywna] => 1
)

[14] => Array
(
[id] => 8
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 4
[archiwum] => 0
[nazwa] => Kategoria4
[aktywna] => 1
)

[15] => Array
(
[id] => 8
[tytul] => News 1
[data] => 25-01-2009
[autor] => Admin
[tresc] =>

TREŚĆ

[skrot] =>

SKRÓT

[glowna] => 1
[aktywny] => 1
[data_w] => 1
[tytul_w] => 1
[autor_w] => 1
[tytul_link] => 1
[kategoria] => 4
[archiwum] => 0
[nazwa] => Kategoria4
[aktywna] => 1
)

)



I problem: jak widać w wyniku to co mi jest potrzebne (wartości n. k. i k1. spełniające kryteria) są powielone wielokrotnie, a chcę je tylko raz, nie wiem co źle zrobiłem w tym zapytaniu...
blooregard
Cytat
Mam takie nieco chaotyczne zapytanie:


Nieco to delikatnie powiedziane.
Poczytaj o złączeniach (JOIN), wtedy na pewno uprościsz sobie to zapytanie.

Wg. mnie:
1. Masz tak skonstruowany warunek, że jest prawdziwy jeszcze dla kilku innych rekordów.
albo:
2. Jesli jesteś w 100% prawidłowości zapytania, zrób sobie GROUP BY newsy.id
llukasz
Jeśli chodzi o JOIN, próbowałem, efekt był identyczny (przynajmniej na pierwszy rzut oka, wszystko powielone). Spróbuję te group.

EDIT Zadziałało GROUP BY, dzięki za pomoc biggrin.gif przyda się bo mój umysł wytworzył takich chaotycznych zapytań więcej pozdrawiam serdecznie
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.