---
title: "hämta och visa information från två olika tabeller"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/184113-hämta-och-visa-information-från-två-olika-tabeller"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "noshornin"
published: "2010-07-16T17:32:34.000Z"
updated: "2010-07-21T22:12:24.000Z"
replies: 15
views: 1066
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/184113-hämta-och-visa-information-från-två-olika-tabeller"
---

# hämta och visa information från två olika tabeller

## #1 — noshornin, 2010-07-16T17:32Z

Jag har funderat på hur jag ska göra utan att riktigt komma på någon lösning. Funderar på att spara informationen i en 2d array men vet inte riktigt hur jag ska göra det i php.

Jag använder mysqli, så här ser koden ut nu:

```php
$sql = "SELECT id, rubrik, date, inlagg, tags FROM inlagg ORDER BY id desc LIMIT ?,?";
if ($stmt = $mysqli->prepare($sql)) 
{
$stmt->bind_param("ii", $start, $hopp);
$stmt->execute();
$stmt->bind_result($inlagsId, $rubrik, $datum, $inlagg, $tags);

while ($stmt->fetch())
{
// skriver ut allting
}
$stmt->close();
}
else
{
die("Could not prepare SQL statement: $sql");
}
```

Jag har en annan tabell som heter kommentarer. Den har en kolumn som heter inlagg som innehåller id't på inlägget som kommentaren publicerats under. Det jag vill är att antalet kommentarer som har publicerats ska skrivas ut tillsammans med inlägget. Hur gör jag nu detta?

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

## #2 — noshornin, 2010-07-18T12:32Z

Ingen som kan hjälpa en noshornin i nöd?

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

## #3 — GunnarD, 2010-07-18T12:40Z

En relativ enkel "left join" borde passa: <http://www.w3schools.com/sql/sql_join_left.asp>

Något liknande detta:

```
SELECT i.id, i.rubrik, i.date, i.inlagg, i.tags, k.kommentar
FROM inlagg as i 
LEFT JOIN kommentarer as k
ON i.id=k.inlagg
ORDER BY id desc LIMIT ?,?
```

Eller så gör du en ny fråga i varje loop där du skriver ut inlägget och bara plockar ut dom kommentarerna som har id=inlagg. Det kanske är enklare.

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

## #4 — noshornin, 2010-07-18T13:03Z

Funkar inne exakt såsom jkag ville.

Din kod skriver ut kommentaren. Det jag ville var att räkna dom.

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

## #5 — GunnarD, 2010-07-18T13:11Z

Då får du i loopen skapa en ny fråga som frågar efter vilka kommentarer som tillhör ett visst inlägg, för att få fram antalet kommentarer så kan du använda <http://www.php.net/manual/en/mysqli-result.num-rows.php>

/red:
Kanske denna fråga skulle hjälpa istället

```
SELECT i.id, i.rubrik, i.date, i.inlagg, i.tags, COUNT(k.inlagg) 
FROM inlagg as i LEFT JOIN kommentar as k ON i.id=k.inlagg 
GROUP BY k.inlagg 
ORDER BY i.id DESC 
LIMIT ?,?
```

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

## #6 — noshornin, 2010-07-18T13:50Z

Problemet jag hade hela tiden verkade vara att ett mysqli objekt enbart kan förbereda en sql sats åt gången. Jag skapade 2 mysqli objekt och använde count() istället:

```php
$mysqli = new mysqli('*****', '********', '******', '*****');  
$mysqli2 = new mysqli('*****', '********', '******', '*****'); 

$sql = "SELECT id, rubrik, date, inlagg, tags FROM inlagg ORDER BY id desc LIMIT ?,?"; 
if ($stmt = $mysqli->prepare($sql)) { 
	$stmt->bind_param("ii", $start, $hopp); 
	$stmt->execute(); 
	$stmt->bind_result($inlagsId, $rubrik, $datum, $inlagg, $tags); 

	while ($stmt->fetch()) { 
		$sql = "SELECT COUNT(*) FROM kommentarer WHERE inlagg = ?";
		if ($result = $mysqli2->prepare($sql)) {		
			$result->bind_param("i", $inlagsId);
			$result->execute();
			$result->bind_result($antal_kommentarer);
			$result->fetch();
			$result->close();
		}
		//skriver ut allting
		echo $antal_kommentarer." kommentarer";
	} 
	$stmt->close(); 
}
```

Förmodligen inte den vackraste lösningen, men det funkar.

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

## #7 — GunnarD, 2010-07-18T13:59Z

Har du provat mitt inredigerat SQL uttryck, om det fungerar så klarar du dig med ett SQL uttryck.

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

## #8 — noshornin, 2010-07-18T14:03Z

vad menas med inredigerat?

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

## #9 — GunnarD, 2010-07-18T15:35Z

Det som står efter "/red:" :)

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

## #10 — noshornin, 2010-07-19T07:34Z

> **[GunnarD skrev:](https://www.webforum.nu/p/1511017)**
>
> Det som står efter "/red:" :)

?? :q

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

## #11 — GunnarD, 2010-07-19T11:15Z

Ok, klistrar in det igen då :)

```
SELECT i.id, i.rubrik, i.date, i.inlagg, i.tags, COUNT(k.inlagg) 
FROM inlagg as i LEFT JOIN kommentar as k ON i.id=k.inlagg 
GROUP BY k.inlagg 
ORDER BY i.id DESC 
LIMIT ?,?
```

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

## #12 — noshornin, 2010-07-19T13:16Z

> **[GunnarD skrev:](https://www.webforum.nu/p/1511110)**
>
> Ok, klistrar in det igen då :)
> 
>
>
> ```
> SELECT i.id, i.rubrik, i.date, i.inlagg, i.tags, COUNT(k.inlagg) 
> FROM inlagg as i LEFT JOIN kommentar as k ON i.id=k.inlagg 
> GROUP BY k.inlagg 
> ORDER BY i.id DESC 
> LIMIT ?,?
> ```

Ahh :i, men det verkar vara något fel med den satsen. Den gick inte att förbereda.

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

## #13 — GunnarD, 2010-07-19T13:23Z

Fick du något felmedelande?

Jag körde den MySQL utan problem

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

## #14 — noshornin, 2010-07-19T13:31Z

nahh bara: 

Could not prepare SQL statement: SELECT i.id, i.rubrik, i.date, i.inlagg, i.tags, COUNT(k.inlagg) FROM inlagg as i LEFT JOIN kommentar as k ON i.id=k.inlagg GROUP BY k.inlagg ORDER BY i.id DESC LIMIT ?,?

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

## #15 — aasah, 2010-07-21T20:46Z

> **[noshornin skrev:](https://www.webforum.nu/p/1511122)**
>
> ```
> SELECT i.id, i.rubrik, i.date, i.inlagg, i.tags, COUNT(k.inlagg) 
> FROM inlagg as i LEFT JOIN kommentar as k ON i.id=k.inlagg 
> GROUP BY k.inlagg 
> ORDER BY i.id DESC 
> LIMIT ?,?
> ```
>
> Ahh :i, men det verkar vara något fel med den satsen. Den gick inte att förbereda.

Satsen innehåller två fel: 
\* Om du grupperar på kolumner så kan du i SELECT-delen bara ta ut de kolumnerna (k.inlagg i det här fallet) samt resultatet av aggregerande funktioner count, max, min, ... Alltså inte i.id, i.rubrik, i.date, i.inlagg, i.tags.
\* Man ska aldrig gruppera på den kolumn man vill räkna på. För varje värde av k.inlägg blir ju  COUNT(k.inlagg) = 1 då.
Om du vill räkna antal kommentarer per inlägg blir det

```
SELECT I.id, I.rubrik, I.date, I.inlagg, I.tags, A.Antal
FROM 
   inlagg I 
   LEFT JOIN (
      SELECT
         K.inlagg, COUNT(*)
      FROM
         kommentar K 
   ) A ON I.id=A.inlagg 
ORDER BY i.id DESC 
LIMIT ?,?
```

För varje inlagg i K räknar subfrågan ut antalet kommentarer till den. För att kunna få ut resten av infon från I måste grupperingen göras i en subfråga, se ovan.

Ovanstående returnerar NULL i antal om kommentarer saknas. Du kan enkelt få en nolla där istället, men hur du gör beror på vilken databas du använder. 
I MySQL används funktionen IFNULL(A.Antal, 0)
I MSSQL blir det ISNULL(A.Antal, 0)
Andra databaser kan ha andra namn på funktionen, men i princip alltså:

```
SELECT I.id, I.rubrik, I.date, I.inlagg, I.tags, IFNULL(A.Antal, 0) as Antal
FROM 
   inlagg I 
   LEFT JOIN (
      SELECT
         K.inlagg, COUNT(*)
      FROM
         kommentar K 
   ) A ON I.id=A.inlagg 
ORDER BY i.id DESC 
LIMIT ?,?
```

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

## #16 — GunnarD, 2010-07-21T22:12Z

> **[aasah skrev:](https://www.webforum.nu/p/1511283)**
>
> Satsen innehåller två fel: 
> \* Om du grupperar på kolumner så kan du i SELECT-delen bara ta ut de kolumnerna (k.inlagg i det här fallet) samt resultatet av aggregerande funktioner count, max, min, ... Alltså inte i.id, i.rubrik, i.date, i.inlagg, i.tags.
> \* Man ska aldrig gruppera på den kolumn man vill räkna på. För varje värde av k.inlägg blir ju  COUNT(k.inlagg) = 1 då.

Är du säker? Jag är det inte.

Kör följande i MySQL och den ger rätt resultat:

```
select i.namn, count(l.dvdid) 
from dvdid as i 
left join dvdlibrary as l on i.id=l.dvdid 
group by l.dvdid 
order by i.namn;
```

l.dvdid ger inte 1 utan den visar rätt siffra.

Att jag inte kan få ut mera ur den tabellen (l) jag gör group() på förstår jag men ur vänster tabellen (i) kan jag plocka ut vilken kolumn som helst.

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

---

Tråden på webben: https://www.webforum.nu/amne/php/184113-hämta-och-visa-information-från-två-olika-tabeller
