проблем с изкарване на записи от база данни

stoqnski

Registered
Здравейте , имам следната структура в БД
[sql]`obiavi `
-id - уникален номер
-grad - gid от `gradove`
-status - приема стойности 1- активна , 0 - неактивна
- ...

`gradove`
-gid - уникален номер
-ggrad - име на града[/sql]

и следния код за изкарване на градовете и колко обяви има в тях :

PHP:
<?
$results = mysql_query("
SELECT count(obiavi.id) as broika, 
gradove.gid as sid, 
gradove.ggrad as namse 
FROM obiavi 
LEFT JOIN gradove ON obiavi.grad = gradove.gid
WHERE obiavi.status = '1'
GROUP BY obiavi.grad
") or die (mysql_error());
while($row= mysql_fetch_assoc($results)) {
echo "<a href=\"gradove.php?gid=$row[sid]\" title=\"за гр.$row[namse]-$row[broika] обяви\"><img src=\"images/grads.png\" width=\"15px\" height=\"15px\" alt=\"град\" />за гр.$row[namse]($row[broika] обяви)</a><br />
		";
			}
			?>

излиза по следния начин :
5396.png

Проблема е , че искам да излизат всички градове независимо дали има обяви в тях или в такъв случай да излиза ( 0 обяви ) . Някакви идеи ?
 
Fakeheal каза:
Заради join-a e. Казва да избере всичко от лявата таблица, ако има и тогава да join-е. Смени на right join.

пробвах с LEFT,INNER & RIGHT JOIN ама резултата е един и същ ...
вади градовете в който има обяви , а останалите не .. :(
 
stoqnski каза:
Проблема е , че искам да излизат всички градове независимо дали има обяви в тях или в такъв случай да излиза ( 0 обяви ) . Някакви идеи ?
Тогава махни WHERE obiavi.status = '1' и групирането ти е неправилно:

PHP:
<?

$results = mysql_query("SELECT SUM(
IF(obiavi.status = '1',1,0)
) as broika, 
gradove.gid as sid, 
gradove.ggrad as namse 
FROM obiavi 
LEFT JOIN gradove ON obiavi.grad = gradove.gid
GROUP BY 2,3
") or die (mysql_error());
Вече ORDER BY ще си го допишеш :?:

Edit : И за да не връща NULL,a 0 :
PHP:
<?

$results = mysql_query("SELECT IF(ISNULL(SUM(IF(obiavi.status = '1',1,0))),
0,SUM(IF(obiavi.status = '1',1,0))
) as broika, 
gradove.gid as sid, 
gradove.ggrad as namse 
FROM obiavi 
LEFT JOIN gradove ON obiavi.grad = gradove.gid
GROUP BY 2,3
") or die (mysql_error());
ako не съм изпуснал някоя скоба, защото пиша директно тук...
 
koko5 каза:
stoqnski каза:
Проблема е , че искам да излизат всички градове независимо дали има обяви в тях или в такъв случай да излиза ( 0 обяви ) . Някакви идеи ?
Тогава махни WHERE obiavi.status = '1' и групирането ти е неправилно:

PHP:
<?

$results = mysql_query("SELECT SUM(
IF(obiavi.status = '1',1,0)
) as broika, 
gradove.gid as sid, 
gradove.ggrad as namse 
FROM obiavi 
LEFT JOIN gradove ON obiavi.grad = gradove.gid
GROUP BY 2,3
") or die (mysql_error());
Вече ORDER BY ще си го допишеш :?:

Edit : И за да не връща NULL,a 0 :
PHP:
<?

$results = mysql_query("SELECT IF(ISNULL(SUM(IF(obiavi.status = '1',1,0))),
0,SUM(IF(obiavi.status = '1',1,0))
) as broika, 
gradove.gid as sid, 
gradove.ggrad as namse 
FROM obiavi 
LEFT JOIN gradove ON obiavi.grad = gradove.gid
GROUP BY 2,3
") or die (mysql_error());
ako не съм изпуснал някоя скоба, защото пиша директно тук...

тези заявки работят , изкарват градовете и колко обяви има в тях , но отново ако няма обява в даден град не изкарва града :(
 
stoqnski каза:
тези заявки работят , изкарват градовете и колко обяви има в тях , но отново ако няма обява в даден град не изкарва града :(
join-a трябва да е RIGHT, опитай :?:

[sql]...RIGHT JOIN gradove ON gradove.gid=obiavi.grad...[/sql]
 
Ето я даже в по-изчистен вид и оптимизирана:

PHP:
<?

$results = mysql_query("SELECT SUM(
	IF(ISNULL(obiavi.status),0,obiavi.status = '1')
) as broika, 
gradove.gid as sid, 
gradove.ggrad as namse 
FROM obiavi 
RIGHT JOIN gradove ON gradove.gid = obiavi.grad
GROUP BY 2,3
") or die (mysql_error());
 
koko5 каза:
Ето я даже в по-изчистен вид и оптимизирана:

PHP:
<?

$results = mysql_query("SELECT SUM(
	IF(ISNULL(obiavi.status),0,obiavi.status = '1')
) as broika, 
gradove.gid as sid, 
gradove.ggrad as namse 
FROM obiavi 
RIGHT JOIN gradove ON gradove.gid = obiavi.grad
GROUP BY 2,3
") or die (mysql_error());

много ти благодаря за пореден път ме спасяваш във важен момент :D +1
най-вероятно няма да мога да пиша след като дам +1 , но ако ти се обяснява какво означава точно в тази заявка "GROUP by 2,3" ще съм ти благодарен
 
stoqnski каза:
много ти благодаря за пореден път ме спасяваш във важен момент :D +1
най-вероятно няма да мога да пиша след като дам +1 , но ако ти се обяснява какво означава точно в тази заявка "GROUP by 2,3" ще съм ти благодарен
Радвам се, че успях да помогна с нещо :) В GROUP BY/ORDER BY може да пишеш както името, така и номера на съответната колона от select-a. Тук те са на 2-ро и 3-то място, както са изброени в select.
Поздрави
 

Back
Горе