[ gagi @ 21.12.2004. 00:36 ] @
Zdravo,

Evo nesto pokusavam pa sam zaglavio, Googlirao sam ali bruka ...


Trebam da izvucem podakte iz baze ali da ih organizujem po kategorijama, so ..
I guess trebam koristiti "GROUP BY". Ovako mi nesto treba ...

New York
- Reklama 1
- Reklama 2
- ...

Chicago
- Reklama 1
- Reklama 2

...
itd.

Znaci da orgnizujem po gradu ... e sada gdje sam zapeo. Ljudi unesu ime grada po kojem ja poslje trebam da organizujem. Ako je neko New York napisao: NEW YORK, New York lii new york napravit ce mi tri kategorije a ja bih to zelio kao jednu kategoriju npr. New York.

Hvala!
[ utvara @ 21.12.2004. 09:33 ] @
GROUP BY UCASE(city) ??

--
Sve najlepse,
Best regards,
Slobodan
[ gagi @ 21.12.2004. 15:21 ] @
Hvala.

Probao sam UPPER/UCASE ali ne radi tj. nista mi ne pokaze kao da nista ne odgovaram tim kriterijama. Ako npr. koristim UPPER('city') onda mi samo izbaci gradove koji su ispisani velikim.


Tek sam poceo da ucim PHP/MySQL pa sam mozda negdje drugo gresku uradio ... evo pogledaj code, pa mozda nesto drugo primjetis ...

btw. city = u_address

Code:
<?php
require 'db_connect.php';

if ($logged_in == 0) {
    echo 'Access Forbidden!';
} else {


// 1 - expired
// 0 - not expired

// ##### Take ads that expires today and are not set as expired #####
$query="SELECT * FROM classified WHERE ex_date=CURDATE() AND expired='0'";
$result=mysql_query($query);
$row=mysql_fetch_array($result);
$num=mysql_numrows($result);


$i=0;
while ($i < $num) {
$id=mysql_result($result,$i,"id");

// ##### Now set as expired ##### 
$setexpire="UPDATE classified SET expired='1' WHERE id='$id'";
$update=mysql_query($setexpire);
$i++;
}


// ##### Old ads are set as expired #####
// ##### Now display approved and not expired ads #####
$query="SELECT * FROM classified WHERE approved='1' AND expired='0'";
$result=mysql_query($query);
$num=mysql_numrows($result);

mysql_close();
  
// VARIABLES/////////////////////////
//$ex_in = 60; //default: expire in 60days
//$ex_date = date ("Y-m-d", mktime(0, 0, 0, date("m"), date("d")+$ex_in, date("Y")));
/////////////////////////////////////

if ($num == 0) { echo "<center><b>NO CLASSIFIED YET</b></center>"; }
else {
echo "<center><b>ALL CLASSIFIEDS<br></b>You have a total of $num classifieds</center>";


$i=0;
while ($i < $num) {
echo "<br>";
$u_headline=mysql_result($result,$i,"u_headline");
$u_content=mysql_result($result,$i,"u_content");
$u_address=mysql_result($result,$i,"u_address");
$ex_date=mysql_result($result,$i,"ex_date");

echo "$u_address<br><b>$u_headline</b><br>$u_content<br><font size=1>expire: $ex_date</font><br><br><br>";

$i++;
}
}
}
?>

[ gagi @ 21.12.2004. 21:50 ] @
Hmmm, izgleda da mi treba ORDER BY a ne GROUP BY

Ovo mi je neki tip s'Dev Shed rekao ...

Citat:

To do what you want is best done in the your presentation layer. Use order by and keep track of when the value of city changes in which case you should display the name of the city.


Group by will return one record for each occurence of the columns in the group by clause.

E.g

Code:

T1:

A | B | C
---------
1 1 2
1 2 1
2 1 3

select a,count(*) from t1 group by a



will return

Code:

A |
------
1 2
2 1



The foremost use of group by is to do aggregations over all rows within a group.

Your group by queries are not well formed since you have columns in the select-clause that is not part of the group by clause. Actually, any other DBMS than Mysql would not allow it since the result is uncpredictable.

Given the same values in T1

Code:

select a,b from t1 where a = 1 group by a



which value of B should be returned? 1 or 2? Mysql will randomly give you one of those.

Another common mistake

Code:

select a,b,max(c) from t1 where a = 1 group by a



in this case many people assume that the value of B will be taken from the record where the max value of C is found but again the value of B is randomly choosen within the group.

So, when using group by all non-aggregated columns in the select list should be present in the group by clause.
[ Riste Pejov @ 22.12.2004. 11:51 ] @
Citat:
gagi: Hvala.

Probao sam UPPER/UCASE ali ne radi tj. nista mi ne pokaze kao da nista ne odgovaram tim kriterijama. Ako npr. koristim UPPER('city') onda mi samo izbaci gradove koji su ispisani velikim.


Pa da, i treba da izbaci gradove koji su samo sa velikim slovima, zatoa trebas i kolonu u selectu UCASE-ovati. Primer:

SELECT aggregate_func(neka_kolona), UCASE(city) FROM TABLE_NAME GROUP BY UCASE(city);

i dobijes nesto kao:

expression | city
-----------------
1 NEW YORK
3 MADRID
2 PARIS
[ jablan @ 22.12.2004. 12:30 ] @
Citat:
gagi: Hmmm, izgleda da mi treba ORDER BY a ne GROUP BY
Ovo mi je neki tip s'Dev Shed rekao ...

Lepo ti je rekao, ne treba ti uopšte GROUP BY, ne znam odakle ti u startu ta ideja.
Jednostavno sortiraš po UCASE(city) i onda kad uzimaš sledeći red u php-u, proveriš da li je polje grad isto kao u prethodnom redu. Ako nije isto, odštampaš neki separator u kome ćeš navesti novo ime grada.

BTW, tim likovima sa devshed-a svaka čast na strpljenju.
[ gagi @ 22.12.2004. 20:48 ] @
Ako stavim UPPER izbaci mi samo sto je veliko; NEW YORK a ostalo (New York i new york) ignjorise tj. nista mi ne pokaze. Zato pitam gdje gresim, jer ne znam ...


@Jablan

Meni treba da spoji NEW YORK, New York i new york u jedan grdan: New York. Mislio sam s'opcijom GROUP BY da to mogu izvesti (spojiti gradove). Covjek mi je objasnio zasto ne moze, nisam najbolje shvatio, uzeo sam i citao malo vise oko toga ... i sada znam.

Nego, da znam rjesenje nebi sigurno postavio pitanje. Prije nego sto sam postavio temu, uradio sam svoj "posao"; probavao i probavao, citao, trazio po googl-u i kad vidim da mi ne ide dalje, ne kontam nista vise ... postavio sam pitanje. Ako si neki n4drkan covjek i nemas vremena da odgovras i ne zelis da pomognes, mislim da ti ovde nije mjesto.

Hvala onim koji su pomogli ...
Ne treba mi vise pomoc, snacu se sam.
[ jablan @ 23.12.2004. 10:00 ] @
Citat:
gagi: Ako stavim UPPER izbaci mi samo sto je veliko; NEW YORK a ostalo (New York i new york) ignjorise tj. nista mi ne pokaze. Zato pitam gdje gresim, jer ne znam ...

Gde staviš UPPER? Okači upit koji koristiš. Za početak, upit treba da ti proradi iz konzole, lako ćeš ga posle iskoristiti u koodu.
Citat:
Ako si neki n4drkan covjek i nemas vremena da odgovras i ne zelis da pomognes, mislim da ti ovde nije mjesto.

Ne znam odakle ti to da sam nadrkan i ne želim da pomognem? Samo sam iskazao divljenje prema liku koji ti je odgovorio onakvim čaršafom na jednostavno pitanje.
[ Riste Pejov @ 24.12.2004. 14:12 ] @
gagi:

Prvo moras koristiti GROUP BY za da dobijes kumulativne rezultate, ko ti je rekao da ti treba ORDER BY valjda je zeleo da te samo skine sa vrata.

Citat:
Riste Pejov:
SELECT aggregate_func(neka_kolona), UCASE(city) FROM TABLE_NAME GROUP BY UCASE(city);


Neznam zasto uopste nisi pokusao ono sto sam ja napisao ? To je pravo resenje imas jednu kolonu koju zelis da grupiras, sve ostale kolona ulaze u group by klauzi i svi imaju UPPER/UCASE gde god i da se nalaze.

A ideja da to resavas u PHP-u umesto u samoj bazi je meni smesna. Ako se radi o PHP problemu prebaci temu u PHP forum.

btw. dizajn samo baze ne valja, za da se ne desavaju ovaki problemi kao tvoj, separiras grad u posebnu tabelu koja ce imate dva polja ID, IME_GRADA.

Pogledaj top teme u forumu Baze podataka http://www.elitesecurity.org/tema/10103