---
title: "Hur ska man hanskas med LEFT JOIN?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/187110-hur-ska-man-hanskas-med-left-join"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Hamatzu"
published: "2011-06-09T12:14:50.000Z"
updated: "2011-06-09T18:52:22.000Z"
replies: 7
views: 622
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/187110-hur-ska-man-hanskas-med-left-join"
---

# Hur ska man hanskas med LEFT JOIN?

## #1 — Hamatzu, 2011-06-09T12:14Z

Hej!
Har en tabell med namn på olika tjänster och en tabell med olika varianter av denna tjänst. Jag vill ha ut namnet på tjänsten och dess tillhörande varianter efter varann.

Har följande sql-fråga:

```
SELECT service.*, service_info.* FROM service LEFT JOIN service_info ON service.service_id = service_info.service_id WHERE service.cal_id=".$cal_id." ORDER BY service.service_id DESC
```

Sedan så loopar jag ut det på följande sätt:

```php
while($r = mysql_fetch_assoc($calRes))
				{

					$service_name = $r['name'];
					$time = $r['time_consumption'];
					
					echo $service_name."
							<br />
                          ".$time;
					
				}
```

Blir följande:

```
Test1
30
Test1
60
Test1
90
Test2
30
Test3
30
Test3
60
```

Jag vill ha detta resultat:

```
Test1
30
60
90
Test2
30
Test3
30
60
```

Permalänk: https://www.webforum.nu/p/187110

## #2 — Pedda, 2011-06-09T12:18Z

Jag är ingen SQL stjärna, men bör du inte använda GROUP BY?

Flyttar även tråden från PHP.

Permalänk: https://www.webforum.nu/p/2279802

## #3 — Hamatzu, 2011-06-09T12:22Z

Har testat det, men då får jag bara ut följande resultat:

```
Test1
30
Test2
30
Test3
30
```

Permalänk: https://www.webforum.nu/p/2279803

## #4 — @nders, 2011-06-09T12:32Z

Jag tänker flytta tillbaka till PHP - eftersom presentationen ska lösas där, inte i SQL.

Du får sätta en kontrollvariabel i php för att hålla koll på den senaste *servicename* du skrivit ut. Är servicename samma i den här iterationen, skriv inte ut det, skriv bara ut tiden. Är servicename ett annat, skriv ut det och sätt om kontrollvariabeln för senaste servicename.

Permalänk: https://www.webforum.nu/p/2279804

## #5 — nitro2k01, 2011-06-09T12:33Z

Finns två sätt att lösa det. Antingen med PHP, och då skriver du bara ut servicenamnet om det är förändrat sen förra rundan.

```php
                $service_name = '';

                while($r = mysql_fetch_assoc($calRes))
                {

                    $time = $r['time_consumption'];
                    if($service_name != $r['name']){
                        $service_name = $r['name'];
                        echo $service_name."<br />\n";
                    }

                    echo $time."<br />\n";
                }
```

Du kan även använda GROUP BY och CONCAT_WS.

```
SELECT service.*, service_info.*, GROUP_CONCAT(service_info.time_consumption SEPARATOR ',') AS time_consumption_c
  FROM service 
LEFT JOIN service_info ON service.service_id = service_info.service_id
 WHERE service.cal_id=".$cal_id."
GROUP BY service.service_id
ORDER BY service.service_id DESC
```

GROUP BY grupperar ihop alla rader med samma service_id till en rad. concat_ws är en aggregatfunktion, ungefär som sum, som gör något med ihopgcupperade rader. Just concat_ws fogar samman alla raderna till en lång sträng. I detta fall har jag angivit att strängarna ska separeras med ett komma.

```php
                while($r = mysql_fetch_assoc($calRes))
                {

                    $service_name = $r['name'];
                    $time = $r['time_consumption'];
                    
                    echo $service_name."<br />\n";
                    $time_array = explode(",", $time);
                    echo implode("<br />\n", $time_array) . "<br />\n";
                }
```

PHP-koden delar i sin tur upp denna sträng efter komman. Då får man en array. Denna array pusslas sedan ihop med strängen "\<br /\>\\n" som klister.

Permalänk: https://www.webforum.nu/p/2279805

## #6 — @nders, 2011-06-09T12:36Z

Kul SQL-lösning, nitro!

Det finns många klurigheter i MySQL - tydligen.  :)
Jag kan dock ändå tycka att det *bör* lösas i php - eftersom man inte bör lösa presentationsproblem i SQL-frågor.

Permalänk: https://www.webforum.nu/p/2279806

## #7 — nitro2k01, 2011-06-09T16:57Z

Snabel-anders: Strikt sett så har jag ju inte löst presentationsproblemet i SQL. Jag gör eventuellt datat lättare/mer logiskt att hantera, men det är inte nödvändigtvis samma sak som att det är presentationen manfixar. Jag fogar samman numren med en separator. Först i PHP bryr jag mig om presentationen efter att jag har delat upp strängen till en array. Hårklyveri kanske, men jag kunde ju lika gärna kört '\<br /\>' som separator direkt. Dock blev det fel funktionsnamn i SQL-koden. Bäst att jag fixar det snabbt så att ingen får reda på att jag skrev fel.

Permalänk: https://www.webforum.nu/p/2279814

## #8 — @nders, 2011-06-09T18:52Z

> **[nitro2k01 skrev:](https://www.webforum.nu/p/1535962)**
>
> Snabel-anders: Strikt sett så har jag ju inte löst presentationsproblemet i SQL. Jag gör eventuellt datat lättare/mer logiskt att hantera, men det är inte nödvändigtvis samma sak som att det är presentationen manfixar.

Ayt!  (y)

> **[nitro2k01 skrev:](https://www.webforum.nu/p/1535962)**
>
> Bäst att jag fixar det snabbt så att ingen får reda på att jag skrev fel.

Ja. Så går det ju inte att ha det.

Permalänk: https://www.webforum.nu/p/2279822

---

Tråden på webben: https://www.webforum.nu/amne/php/187110-hur-ska-man-hanskas-med-left-join
