Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [sql] INNER JOIN + kilka warunków
BzikOS
post 8.04.2004, 18:02:20
Post #1





Grupa: Przyjaciele php.pl
Postów: 660
Pomógł: 0
Dołączył: 28.08.2002
Skąd: Starachowice

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


Mam takie zapytanie:

[sql:1:bbebac0bac]SELECT
c.id AS id,
c.name AS name,
c.description AS description,
count( distinct i.id ) AS total
FROM
categories c
LEFT JOIN image i ON (i.id_category=c.id AND i.status='1')
WHERE
c.status = '1' AND
c.id_parent = '$id'
GROUP BY
c.id
ORDER BY
c.name[/sql:1:bbebac0bac]

Wyciąga ono informacje o Galeriach zdjęć takie jak: nazwa galerii, opis i liczbe zdjęć jakie wchodzą w skład galerii. Działa doskonale, ale wprowadziłem jeszcze możliwość blokowania użytkowników i w takim przypadku, gdy użytkownik jest zablokowany, jego zdjęcia nie są wyświetlane, a więc nie powinny być też zliczane. Dodałem więc linijkę:

[sql:1:bbebac0bac]INNER JOIN users u ON ( u.id = i.id_user AND ( u.status='1' OR ( u.status='0' AND u.permissions='9' ) ) )[/sql:1:bbebac0bac]
po LEFT JOIN'ie.
Działa prawie dobrze, bo wycina zdjęcia, należące do zablokowanego usera, ale jeżeli zdjęć w galerii zostanie 0 - czyli wytnie wszystkie, to nie zwraca żadnych ionformacji o takiej galerii, a powinno zwrócić z liczbą zdjęc wynoszącą '0' - INNER wycina wszystko w pień smile.gif
Jak zrobić, aby zwracało informacje o wszystkich galeriach, nawet o tych w których liczba fotografii == 0?

Podaję uproszczone struktury tabel, na których operuje to zapytanie:


[sql:1:bbebac0bac]CREATE TABLE categories (
id int(11) unsigned NOT NULL auto_increment,
id_parent int(11) unsigned default '0',
name varchar(32) default NULL,
description varchar(255) default NULL,
status tinyint(1) default '0',
PRIMARY KEY (id)
) TYPE=MyISAM;

CREATE TABLE image (
id int(11) unsigned NOT NULL auto_increment,
id_category int(11) unsigned default NULL,
id_user int(11) unsigned default NULL,
status tinyint(1) default '0',
PRIMARY KEY (id)
) TYPE=MyISAM;


CREATE TABLE users (
id int(11) unsigned NOT NULL auto_increment,
permissions tinyint(1) unsigned default '0',
status tinyint(1) default '1',
PRIMARY KEY (id)
) TYPE=MyISAM;
[/sql:1:bbebac0bac]
Go to the top of the page
+Quote Post
DeyV
post 8.04.2004, 20:31:55
Post #2





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Tak ponoć działa smile.gif

[sql:1:b475be7a15]SELECT c.id AS id, u.status AS ustatus, SUM( if( u.status = '1' , 1, 0 ) )
FROM categories c
LEFT JOIN image i ON ( i.id_category = c.id AND i.status = '1' )
LEFT JOIN users u ON ( u.id = i.id_user AND u.status = '1' )
WHERE c.status = '1' AND c.id_parent = '1'
GROUP BY c.id
ORDER BY c.name[/sql:1:b475be7a15]


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
BzikOS
post 8.04.2004, 20:46:02
Post #3





Grupa: Przyjaciele php.pl
Postów: 660
Pomógł: 0
Dołączył: 28.08.2002
Skąd: Starachowice

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


Dokładnie to tak:
[sql:1:9b8c224389]SELECT
c.id AS id,
c.name AS name,
c.description AS description,
SUM( IF( u.status = '1' OR u.permissions = '9', 1, 0) ) AS total
FROM
categories c
LEFT JOIN image i ON ( i.id_category=c.id AND i.status='1' )
LEFT JOIN users u ON ( u.id = i.id_user )
WHERE
c.status = '1' AND
c.id_parent = '$id'
GROUP BY
c.id
ORDER BY
c.name[/sql:1:9b8c224389]

Ale to jest to smile.gif
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 Wersja Lo-Fi Aktualny czas: 28.04.2025 - 08:31