webForumDet fria alternativet

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

PHP

15 svar · 1 063 visningar · startad av noshornin

Medlem sedan aug. 2008815 inlägg
Frågan#1

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:

$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?

Medlem sedan aug. 2008815 inlägg
#2

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

Medlem sedan juni 20014 290 inlägg
#3

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.

Medlem sedan aug. 2008815 inlägg
#4

Funkar inne exakt såsom jkag ville.

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

Medlem sedan juni 20014 290 inlägg
#5

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 ?,?
Medlem sedan aug. 2008815 inlägg
#6

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:

$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.

Medlem sedan juni 20014 290 inlägg
#7

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

Medlem sedan aug. 2008815 inlägg
#8

vad menas med inredigerat?

Medlem sedan juni 20014 290 inlägg
#9

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

Medlem sedan aug. 2008815 inlägg
#10

GunnarD skrev:

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

?? :q

Medlem sedan juni 20014 290 inlägg
#11

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 ?,?
Medlem sedan aug. 2008815 inlägg
#12

GunnarD skrev:

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.

Medlem sedan juni 20014 290 inlägg
#13

Fick du något felmedelande?

Jag körde den MySQL utan problem

Medlem sedan aug. 2008815 inlägg
#14

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 ?,?

Medlem sedan mars 20034 471 inlägg
#15

noshornin skrev:

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 ?,?
Medlem sedan juni 20014 290 inlägg
#16

aasah skrev:

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.

283 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
150 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)