Skocz do zawartości

Skomplikowane zapytanie sql


Tomahawk

Rekomendowane odpowiedzi

Witam!

Mam takie tabele:

KATEGORIE

id|name|last_art_id|last_writer_id...

ARTY

id|title|body|cat_id|writer_id...

WRITERS

id|login|pass|num_arts...

I teraz chce za pomocą jednego zapytania złapać coś takiego:

Nazwa kategorii, tytuł ostatniego arta, nazwa ostatniego writera

Myślałem o :

sql="SELECT kategorie.name, arty.title, writers.login FROM kategorie, arty, writers WHERE kategorie.last_art_id=arty.id and kategorie.last_writer_id=writer.id";

Ale mankament jest tego taki że jak nie będzie w kategorii żadnego artykułu to mi nie wyświetli kategorii.

Drugi sposób z użyciem LEFT JOIN:

sql="SELECT kategorie.name, arty.title, writers.login FROM kategorie LEFT JOIN arty ON kategorie.last_art_id=arty.id LEFT JOIN writers ON kategorie.last_writer_id=writer.id";

Ale tu znowu jest taki problem że jak mam np. 3 arty w 1 kategorii to tą kategorię wyświetla mi 3 razy i pobiera wszystkie artykuły a nie ten z id=las_art_id (LEFT JOIN).

Macie jakieś propozycje?

Jest jakaś klauzula za pomocą której da się to osiągnąć ale już nie pamiętam która to i nie mogę jej znaleźć.

Odnośnik do komentarza
Udostępnij na innych stronach

Tez sie podepne z podobnym pytaniem :) Mam kwerende:

SELECT substring( datetime, 1, 10 ) AS date, COUNT( id ) AS date_count FROM wejscia_".$page_id." GROUP BY date BETWEEN DATE '$from' AND DATE '$to'

Na wyjsciu daje ona liczbe zdarzeń które "zaszły" w poszczególnych dniach pomiędzy $from a $to. Niestety to działa jedynie gdy przynajmniej jedno zdarzenie zaszło danego dnia, w innym przypadku pomija ten dzień. Czy da się tą kwerende zmodyfikować tak żeby wyświetlała wszystkie dni pomiędzy $from a $to, a dla tych z nich w których zdarzenie nie zaszło przypisywało poprostu date_count == 0 ?

Wogole ta kwerenda troche dziwnie dziala. Czasami dziala, czasami nie, a czasami wypluwa tylko liczbe "zdarzen" ktore zaszly w dwoch krancowych dniach - $from i $to, a przeciez tam jest BETWEEN i powinno wypluwac wszystko pomiedzy ?

Tutaj bedzie sygnaturka

Odnośnik do komentarza
Udostępnij na innych stronach

Tez sie podepne z podobnym pytaniem ;) Mam kwerende:

SELECT substring( datetime, 1, 10 ) AS date, COUNT( id ) AS date_count FROM wejscia_".$page_id." GROUP BY date BETWEEN DATE '$from' AND DATE '$to'

Na wyjsciu daje ona liczbe zdarzeń które "zaszły" w poszczególnych dniach pomiędzy $from a $to. Niestety to działa jedynie gdy przynajmniej jedno zdarzenie zaszło danego dnia, w innym przypadku pomija ten dzień. Czy da się tą kwerende zmodyfikować tak żeby wyświetlała wszystkie dni pomiędzy $from a $to, a dla tych z nich w których zdarzenie nie zaszło przypisywało poprostu date_count == 0 ?

te dni w których jest ZERO musisz jakoś dopisać, albo po stronie bazy SQL albo po stronei PHP

w php to bedzei banalne:

-wyniki z zapytania musza być posortowane po dacie i tylko sprawdzasz podczas wyświetlania danych czy dany dzień istnieje w zapytaniu czy nie , jezli istnieje wyświetlasz wartosc z zapytania jezli nie wyswietlasz "0"

w SQL możesz to zrobić przez dopisanie do każdego dnia jednego wiersza do tabeli, w wynikach bedziesz musiał odjać "1" i da sie to zrobić w jednym zapytaniu

ewentualnie wygenerować zapytanie w stylu

SELECT "2007-01-01" as date, ( select  COUNT( id ) FROM wejscia_".$page_id WHERE date = "2007-01-01"  )  as date_count
union 
SELECT "2007-01-02" as date, ( select  COUNT( id ) FROM wejscia_".$page_id WHERE date = "2007-01-02"  )  as date_count
union 
SELECT "2007-01-03" as date, ( select  COUNT( id ) FROM wejscia_".$page_id WHERE date = "2007-01-03"  )  as date_count
 union 
SELECT "2007-01-04" as date, ( select  COUNT( id ) FROM wejscia_".$page_id WHERE date = "2007-01-04"  )  as date_count

co do wydajnosci to nie bedzie juz taka dobra ;) wszak dla roku bedzie 365 zappytań

Odnośnik do komentarza
Udostępnij na innych stronach

Witam!

Mam takie tabele:

KATEGORIE

id|name|last_art_id|last_writer_id...

ARTY

id|title|body|cat_id|writer_id...

WRITERS

id|login|pass|num_arts...

I teraz chce za pomocą jednego zapytania złapać coś takiego:

Nazwa kategorii, tytuł ostatniego arta, nazwa ostatniego writera

tutaj tez z pomoca przyjda podzapytania:

SELECT 
	K.NAME, 
	K.ID , 
	( select ARTY.TITLE FROM ARTY where arty.id= K.last_art_id) as ostatni_tytul,
	( select WRITERS.LOGIN FROM WRITERS where WRITERS.id= K.last_writer_id) as ostatni_writers

FROM KATEGORIE K

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...

Ok.

A teraz mam taki problem z COUNT().

Otóż mam 2 tabele w każdej z nich jest kolumna liczba.

I teraz chce pobrać za jednym zapytaniem ilość rekordów z tabela1 gdzie liczba jest większa od 10 i z tabela 2 gdzie liczba jest większa od 10.

Wymyśliłem takie zapytanie:

SELECT COUNT(id) as c_t1, COUNT(id) AS c_t2 FROM tabela1, tabela2 WHERE tabela1.liczba>10 and tabela2.liczba>10;

Ale to nie działa jak trzeba bo mi łączy tabele....

Macie jakieś pomysły?

Odnośnik do komentarza
Udostępnij na innych stronach

ma zwrócic dwie liczby czy jedną ?

to zwroci dwie liczby :

SELECT count(id) FROM tabela1 where liczba > 10 
UNION ALL
SELECT count(id) FROM tabela2 where liczba > 10;

A teraz w jednym zapytaniu liczba spólna

popróbował bym tak:

SELECT
( select count(id) FROM tabela1 where liczba > 10 )  + ( select count(id) FROM tabela2 where liczba > 10 )

ewentualnie

SELECT sum (
 SELECT count(id) FROM tabela1 where liczba > 10 
 UNION ALL
 SELECT count(id) FROM tabela2 where liczba > 10 
)

Jak zawsze zapomniałem o aliasach dla podzapytań to trzeba sobie podopisywać

Odnośnik do komentarza
Udostępnij na innych stronach

Ok działa. Chodziło mi o ten pierwszy wariant, czyli 2 liczby.

A teraz jeszcze załóżmy że w tabeli tabela1 mam jeszcze dodatkowo kolumnę costam i chce pobrać wszystkie costam gdzie liczba>10 (czyli ten sam warunek). Da się to poskładać jakoś czy oddzielne zapytanie trzeba?

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności