Just nu i M3-nätverket
Jump to content

GROUP BY?


makke

Recommended Posts

Jag har en tabell där arbetsgivare kan lägga in olika projekt de drivit.

Alla jobb tilldeles ett unikt id och info om arbetsgivare, projektet, när projektet ägde rum osv.

När jag sen ska hämta infon vill jag att de ska sorteras utifrån arbetsgivare ex.

 

arbetsgivare 1

-projekt 1

-projekt 2

-projekt 3

 

arbetsgivare 2

-projekt 1

-projekt 2

 

arbetsgivare 3

-projekt 1

-projekt 2

-projekt 3

-projekt 4

 

osv...

 

Jag skulle ju kunna göra en SELECT-query för varje arbetsgivare men det känns som om det måste finnas lättare sätt..

Fick för mig att jag läst här på portalen om GROUP men hittade inte det inlägget nu när jag sökte och testade någon query typ

 

PHP: 
1:  $projekt = mysql_query ("SELECT * FROM projekt GROUP BY arbetsgivare DESC")
2: or die(mysql_error());
3:  
4: while($row = mysql_fetch_array( $projekt )) 
5:      {                  osv...  

 

 

Men då plockade han bara ett projekt per arbetsgivare.. Skulle behöva få en knuff i rätt riktning.. Dessutom när jag sökte på GROUP på php.net så hittade jag inte mycket heller.. Fick inga dirketsvar på GROUP utan bara på filegroup, posix_getgroups osv..

 

 

EDIT:

Nu dök något annat upp i mitt huvud.. SORT kan man använda det precis som ORDER BY eller GROUP BY? :S

Och är det överhuvudtaget användbart i det här sammanhanget?

[inlägget ändrat 2007-10-23 12:00:24 av makke]

Link to comment
Share on other sites

Där stod det inte mycket..

Hittade två sidor där det stod om GROUP BY men det sa mig inte så mycket om hur man använder dem..

 

When you have chosen the columns you wish to query, you can use the other query building buttons to complete your query with WHERE , GROUP BY , and ORDER BY clauses.

 

Men är det så att GROUP BY bara kan användas på SELECT COUNT?

 

Link to comment
Share on other sites

Nej, GROUP BY kan användas med select också.

Några exempel jag hittade i mySql-dokumentationen:

SELECT c1, c2 FROM t1 GROUP BY c1, c2;
SELECT DISTINCT c1, c2 FROM t1;
SELECT c1, MIN(c2) FROM t1 GROUP BY c1;
SELECT c1, c2 FROM t1 WHERE c1 < const GROUP BY c1, c2;
SELECT MAX(c3), MIN(c3), c1, c2 FROM t1 WHERE c2 > const GROUP BY c1, c2;
SELECT c2 FROM t1 WHERE c1 < const GROUP BY c1, c2;
SELECT c1, c2 FROM t1 WHERE c3 = const GROUP BY c1, c2;

 

$projekt = mysql_query ("SELECT * FROM projekt GROUP BY arbetsgivare DESC")

Tror att DESC/ASC bara kan användas med ORDER BY och att du vill ha ASC

Vad händer om du skriver

SELECT * FROM projekt ORDER BY arbetsgivare ASC

?

 

EDIT: tittade vidare och ser att jag trodde fel. ASC/DESC kan mycket väl användas med GROUP BY!

se "13.2.7. SELECT Syntax" i MySql Reference Manual

[inlägget ändrat 2007-10-23 13:32:26 av ]-[ildeQ]

Link to comment
Share on other sites

Om det nu var ORDER BY jag läste om för längesedan så var finessen med det att man kunde dela in infon efter kategorierna.. Order by blir ju bara

 

Arbetsgivare1

Projekt1

Arbetsgivare1

Projekt2

Arbetsgivare2

Projekt1

Arbetsgivare2

Projekt2

Arbetsgivare2

Projekt3

Arbetsgivare3

Projekt1

Arbetsgivare3

Projekt2

 

Det jag söker kunde dela in infon som en lista med rubriker

 

Arbetsgivare1

Projekt1

Projekt2

Arbetsgivare2

Projekt1

Projekt2

Projekt3

Arbetsgivare3

Projekt1

Projekt2

 

 

Link to comment
Share on other sites

Också ett tag sedan jag höll på med sånt. Glömsk är jag dessutom så jag får förlita mig på manualen.

;o)

 

Nästa förslag:

SELECT * FROM projekt GROUP BY arbetsgivare ORDER BY fält1, fält2, fält3

 

Tror att bägge sker ASC om inget anges.

 

 

 

 

 

 

Link to comment
Share on other sites

Ja, det var typ så jag fattade manualen oxå..

Men då plockar han bara ett projekt per arbetsgivare...

Jag fattar verkligen inte! Jag trodde att det skulle vara ett lätt sätt..

SORT då går det att använta på liknande sätt? Jag får error om jag skriver SORT BY..

 

Link to comment
Share on other sites

Sort by är nog ingen MySql-kommando, utan order by, vilket är samma sak.

 

Får du resultatet genom php eller testar du direkt i MySql?

 

 

Link to comment
Share on other sites

Genom php.. Jag skriver ut det å sidan..

Ska testa direkt i MySQLn oxå.

 

EDIT:

Likadant i MySQLn..

 

 

[inlägget ändrat 2007-10-23 14:38:01 av makke]

Link to comment
Share on other sites

Förvånad!

 

Gäller det en och samma tabell?

EDIT: Och finns det arbetsgivare som har mer än 1 projekt för tillfället?

 

 

[inlägget ändrat 2007-10-23 14:42:45 av ]-[ildeQ]

Link to comment
Share on other sites

Tyvärr... inga fler förslag.

 

:o|

]-[ildeQ

 

EDIT: Svårt att släppa det här... Undrar om du inte jobbar mot fel databas...

[inlägget ändrat 2007-10-23 16:12:21 av ]-[ildeQ]

Link to comment
Share on other sites

Som jag tolkar det är det en ren sortering du vill ha. Då borde detta fungera.

 

SELECT * FROM projekt ORDER BY arbetsgivare, projektnamn

 

Heter tabellen eller fälten annat får du självklart ändra dessa.

 

GROUP BY används då du vill använda någon funktion(count, sum etc) på något fält. Den ger visserligen en sortering men om du inte vill använda en funktion fungerar det inte.

 

Stigande sortering (ASC) är default och behöver inte skrivas ut. Har du flera fält som ska sorteras varav några ska sorteras fallande kan det dock vara lämpligt att skriva ASC för att göra det lättare att tolka i efterhand.

 

Link to comment
Share on other sites

När jag skriver så får jag följande resultat.. :

 

Arbetsgivare1

Projekt1

Arbetsgivare1

Projekt2

Arbetsgivare2

Projekt1

Arbetsgivare2

Projekt2

Arbetsgivare2

Projekt3

Arbetsgivare3

Projekt1

Arbetsgivare3

Projekt2

 

Och detta är resultatet jag vill få..

 

Arbetsgivare1

Projekt1

Projekt2

Arbetsgivare2

Projekt1

Projekt2

Projekt3

Arbetsgivare3

Projekt1

Projekt2

 

 

Jag skriver ut infon på följande sättet:

 

while($row = mysql_fetch_array( $projekt ))

{

echo $row['arbetsgivare']."<br>";

echo $row['projekt']."<br>";

}

 

Ska jag skriva ut den på något annat sätt?

 

Link to comment
Share on other sites

Själv tycker jag att man först skall testa direkt i MySql (med MySql Query Browser t.ex.) och gä över till PHP när svaret blir som man vill ha det.

På det viset vet du om felet ligger i queryn eller i utskriftskoden.

Och det ser ut som du får ut allting fast inte på önskat sätt.

 

Tillägg:

Just nu skriver du i PHP-koden mycket riktigt ut:

arbetsgivare

projekt

arbetsgivare

projekt

...

 

medan tanken är att bara skriva ut arbetsgivaren när den ändras.

 

Tillägg 2:

Om det är så att GROUP BY enbart fungerar med en funktion, kan man kanske använda sig av count() och sedan låta bli att skriva ut count-värdet?

 

;o)

]-[ildeQ

 

 

[inlägget ändrat 2007-10-23 21:13:15 av ]-[ildeQ]

[inlägget ändrat 2007-10-23 21:33:54 av ]-[ildeQ]

Link to comment
Share on other sites

Spara värdet på vilken arbetsgivare det är i en variabel.

Kolla sen i loopen om det är samma som ska skrivas ut, är det det så skriv inte ut den, utan skriv ut nästa projekt.

 

Link to comment
Share on other sites

Oj, hur skulle något dylikt se ut?

 

först en SELECT-sql?

 

$sql = mysql_query ("SELECT * FROM projekt");
$projekt = mysql_fetch_array($sql)
or die(mysql_error());

 

sedan spara i en variabel?

 

$arbetsgivare = $projekt['arbetsgivare'];

och sen en if-sats?

Hur skulle den se ut?

 

eller en loop

 

while($projekt['arbetsgivare'] !== $arbetsgivare) {}

Det skulle ju inte funka.. då jämför man ju den med sig själv och man skulle aldrig få ut nåt..

 

 

Jag är totalt lost måste jag erkänna.. SNälla, hjälp mig upp på banan..

 

 

 

Link to comment
Share on other sites

Är inge bra på php, men rent logiskt så funkar det ju om du sätter variabeln $arbetsgivare innuti loopen (dvs. efter kollen).

 

/Cluster

------------------------------------------------------------

Ditt vetande är värdelöst om inte andra vet att du vet

-----------> http://eforum.kicks-ass.net <------------

 

Link to comment
Share on other sites

Detta är nog det du är ute efter.

 

<?PHP

$link =mysql_connect('DATABAS', 'USER','PW')

or die("Kunde inte ansluta mot databasen: ". mysql_error());

mysql_select_db('databas',$link) or die("Kunde inte välja databas");

$query = "SELECT Arbetsgivare, Projekt from Projekt ORDER BY Arbetsgivare, Projekt";



$result=mysql_query($query, $link) or die("Frågan misslyckades:" .mysql_error());

$Huvud="";

$i=0;

$num=mysql_numrows($result);

while ($i < $num) {



$Arbetsgivare=mysql_result($result,$i,"Arbetsgivare");

$Projekt=mysql_result($result,$i,"Projekt");

If($Arbetsgivare!==$Huvud):

echo $Arbetsgivare."<br>";

EndIf;

echo $Projekt."<br>";

$Huvud=$Arbetsgivare;	

$i++;

}



/* Frigör minnet som SQL frågan reserverade */

mysql_free_result($result);



/* Avsluta anslutningen */

mysql_close($link);

?>

 

Nu har jag inte jobbat särskilt mycket med PHP så det finns säkert snyggare lösningar men detta fungerar när jag testar på en egen tabell.

 

Link to comment
Share on other sites

Min tanke var precis så som Cluster och Erki nämnde/visade, alltså inne i loopen sker detta.

Då kan man ju kolla om det är en nya arbetsgivare eller inte.

Skrev det kanske lite svårbegripligt, tanken var långt förre det jag skrev :)

 

[inlägget ändrat 2007-10-24 20:16:08 av Micke_skane]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...