Panelen



Forumnavigering
Senast inloggade
RSS
Sponsorer

Forum > Webbutveckling relaterat > Databaser och SQL

Sammanfoga tabeller (PHP+MYSQL)

Saamir
Saamir

Gradering

#16165

Har lite problem med att sätta ihop två tabeller. Försöker nämligen att bygga ett eget forum. Har lyckats bra hittills.

Jobbar med php+mysql här.

 

Nu vill jag räkna antal inlägg i en tråd, precis som ett vanligt forum.

 

Jag kan börja med att visa hur mysql tabellen ser ut:

 


CREATE TABLE IF NOT EXISTS `forum_answer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userid` int(11) NOT NULL,
  `threadid` int(11) NOT NULL,
  `text` text NOT NULL,
  `date` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=22 ;
 
 
-- --------------------------------------------------------
 
 
CREATE TABLE IF NOT EXISTS `forum_thread` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `categoryid` int(11) NOT NULL,
  `subject` varchar(100) NOT NULL,
  `posted` varchar(100) NOT NULL,
  `last_answer` varchar(100) NOT NULL,
  `visits` int(11) NOT NULL,
  `locked` int(11) NOT NULL,
  `pinned` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

 

Under forum_answer ligger det ett antal siffror i threadid beroende på hur många inlägg som gjorts i de olika trådarna, och dessa threadid ska koppas till forum_thread - id som är id för varje tråd.

 

Nu vill jag räkna alla siffror till den tråden om ni förstår vad jag menar så att innan man går in i den tråd så ska det stå hur många inlägg som gjorts i den tråden.

 

exempel

id1(en tråd) har 4 inlägg

id2(en annan tråd) har 2 inlägg osv..

 

Jag har för mig att man behöver använda sig av JOIN eller ORDER BY i MYSQL coden men har problem här.. har testat utan resultat:


 $sql = mysql_query("SELECT `id` FROM `forum_thread`") or die(mysql_error());
while ( $info = mysql_fetch_array ( $sql ))
{
 
$thread_sql = mysql_query("SELECT `threadid` FROM `forum_answer` WHERE `threadid` = '". $info['id'] ."'") or die(mysql_error());
$thread_count = mysql_num_rows($thread_sql);


 

Någon som vill hjälpa mig, och berätta vad jag gör för fel?

 

tack.

 

 

 

 

ID: #16165 | Skapades: 2009-06-17 16:44:20 | Tråden har 23 svar och har lästs 1163 gånger.
Sida: 1 2

voigtan
voigtan

Gradering

#16166

Jag hinner inte riktigt ge ett korrekt svar  (har ett tåg att passa) men:

1. Du behöver göra en join, skall se vad som är relationen mellan dina två tabeller i din sql när jag kommer hem.

2. Du behöver en Count(*) för att se hur många svar ett forum har, och GROUP BY förmodligen.

3. du behöver/bör inte skriva 'id' osv, det är inte en referens du gör där utan en sträng.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #16166 | Skapades: 2009-06-17 16:49:58

Saamir
Saamir

Gradering

#16167

Citerar voigtan:

Jag hinner inte riktigt ge ett korrekt svar  (har ett tåg att passa) men:

1. Du behöver göra en join, skall se vad som är relationen mellan dina två tabeller i din sql när jag kommer hem.

2. Du behöver en Count(*) för att se hur många svar ett forum har, och GROUP BY förmodligen.

3. du behöver/bör inte skriva 'id' osv, det är inte en referens du gör där utan en sträng.

 

Jag förstod det, Join+count() och GROUP BY behöver göras.

Dock har jag inte mycket kunskaper i detta, men jag ska försöka.

Skulle vara tacksam och du fick mig att förstå. :) jag väntar på dig, under tiden får jag läsa på och testa.

 

Tack

ID: #16167 | Skapades: 2009-06-17 16:59:48

Hultin
Hultin

Gradering

#16168

Ett alternativ till att köra count i SQL:en är att köra mysql_num_rows, men då det är rader från två tabeller så kommer den att räkna alla rader från båda tabellerna. (som matchar din query då). Används: $numrows = mysql_num_rows($sql);


Join är enkelt: "SELECT * FROM tabell INNER JOIN tabell2 ON tabell.id = tabell2.id"

... ORANGE HEARTS!
ID: #16168 | Skapades: 2009-06-17 17:02:01

voigtan
voigtan

Gradering

#16169

Det räcker dock inte bara med en join fråga, då man vill ha hur många det är också, det är inte en "smidig" lösning men det går. Offtast så har man ett fält med en count som uppdatera sig själv när man gör en postning då det är en lite krävande sql fråga ;) (börja sätta mig och gör ett test med din struktur just nu).

En annan sak, datum bör vara av datatyp datum(timeDate?) Du kommer straffa dig själv om du inte gör en korrekt databas struktur.

Och "Locked" och pinned bör väl vara en bit(booleanskt värde) Eller kan de vara annat än "Öppen eller låst" och "Pinnad eller inte pinnad" tråd?

Och, vad är det för fält du vill visa? Bara från forum_thread + hur många svar?

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
Redigerades av voigtan den 17 juni 2009. Läs tidigare inlägg.
Redigerades av voigtan den 17 juni 2009. Läs tidigare inlägg.
ID: #16169 | Skapades: 2009-06-17 17:40:30

voigtan
voigtan

Gradering

#16171

SELECT
    ft.Id,
    ft.CategoryId,
    ft.subject,
    ft.posted,
    ft.last_answer,
    ft.visits,
    ft.locked,
    ft.pinned,
    Count(fa.threadid) NumberOfAnswers
FROM
    forum_thread ft
        LEFT JOIN forum_answer fa ON ft.Id = fa.threadid
GROUP BY
    ft.Id,
    ft.CategoryId,
    ft.subject,
    ft.posted,
    ft.last_answer,
    ft.visits,
    ft.locked,
    ft.pinned

Men om möjligt så hade jag övervägt att lagra "antal" svar redan i forum_thread, då du har "visits" och "last_answer" där redan.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #16171 | Skapades: 2009-06-17 18:43:32

Saamir
Saamir

Gradering

#16172

Jag vill ha antal inlägg i den spec. tråden.

 

Jag vill inte lagra "antal" svar för det är för svårt för mig att fixa :P jag hoppades på att det finns en lösening till det jag redan har.

Hur skulle allt se ut i min kode..

 

Jag har testat med detta:

$sql = mysql_query("SELECT * FROM `forum_thread` ORDER BY `id` ASC") or die(mysql_error());
while ( $info = mysql_fetch_assoc( $sql ))
{
 
  $answer_sql = mysql_query("SELECT COUNT(*) FROM `forum_answer` WHERE `threadid` = '". $info['id'] ."' GROUP BY `threadid`") or die(mysql_error());
  $num_posts = 0;
  if($row = mysql_fetch_row($answer_sql)) {
    $num_posts = $row[0];
  }

 

Men som du säger, det behöver göras mer än så.

 

Lekte lite, kanske såhär?

 

 $answer_sql = mysql_query("SELECT `forum_thread`.`id` Count(`forum_answer`.`threadid`) NumberOfAnswers FROM `forum_thread`, `forum_thread` LEFT JOIN `forum_answer` forum_answer ON `forum_thread`.`id` = `forum_answer`.`threadid` GROUP BY `forum_thread`.`id`") or die(mysql_error());
  $answer_count = mysql_num_rows($answer_sql);

 

Kör jag den, syns inget alls..

 



Redigerad av Saamir
Anledning:

Error jag fick:

[error=]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Count(forum_answer.threadid) NumberOfAnswers FROM forum_thread, forum_thread LEF' at line 1[error=]

ID: #16172 | Skapades: 2009-06-17 19:58:14

voigtan
voigtan

Gradering

#16173

[quote]Jag vill inte lagra "antal" svar för det är för svårt för mig att fixa[/code]Förstå inte varför det skulle vara svårare, det är ju bara att skriva typ: UPDATE .... PostCount = postCount+1

Men, men.

Jag förstå inte varför du envisas att skriva ` i dina fält, ta bort skitet tbh.

Varför tar du inte bara min SQL fråga, det är ju det du är ute efter. Jag orkar inte ens kolla igenom dina SQL frågor, ser ett par problem där med COUNT saken. Du behöver inte skapa 1 + så många trådar du har SQL:er, min SQL fråga skall hämta alla trådar, och lagra antal tråd svar i en SQL fråga. Extremt onödigt att köra SQL anrop så många gånger.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #16173 | Skapades: 2009-06-17 20:03:11

voigtan
voigtan

Gradering

#16174

Citat:

Error jag fick:

[error=]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Count(forum_answer.threadid) NumberOfAnswers FROM forum_thread, forum_thread LEF' at line 1[error=]

Ser ut som att du har en konstig FROM sats

SELECT ft.Id, ft.CategoryId, ft.subject, ft.posted, ft.last_answer, ft.visits,ft.locked, ft.pinned, Count(fa.threadid) NumberOfAnswers FROM forum_thread ft LEFT JOIN forum_answer fa ON ft.Id = fa.threadid GROUP BY ft.Id, ft.CategoryId, ft.subject, ft.posted, ft.last_answer, ft.visits, ft.locked, ft.pinned

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #16174 | Skapades: 2009-06-17 20:09:39

Saamir
Saamir

Gradering

#16175

Citerar voigtan:

[quote]Jag vill inte lagra "antal" svar för det är för svårt för mig att fixa[/code]Förstå inte varför det skulle vara svårare, det är ju bara att skriva typ: UPDATE .... PostCount = postCount+1

Men, men.

Jag förstå inte varför du envisas att skriva ` i dina fält, ta bort skitet tbh.

Varför tar du inte bara min SQL fråga, det är ju det du är ute efter. Jag orkar inte ens kolla igenom dina SQL frågor, ser ett par problem där med COUNT saken. Du behöver inte skapa 1 + så många trådar du har SQL:er, min SQL fråga skall hämta alla trådar, och lagra antal tråd svar i en SQL fråga. Extremt onödigt att köra SQL anrop så många gånger.

 

hehe, okej :P

 

Körde din sql code nu det blir inte så som jag vill ändå.

 

  $answer_sql = mysql_query("SELECT
    forum_thread.Id,
    forum_thread.CategoryId,
    forum_thread.subject,
    forum_thread.posted,
    forum_thread.last_answer,
    forum_thread.visits,
    forum_thread.locked,
    forum_thread.pinned,
    Count(forum_answer.threadid) NumberOfAnswers
FROM
    forum_thread forum_thread
        LEFT JOIN forum_answer forum_answer ON forum_thread.id = forum_answer.threadid
GROUP BY
    forum_thread.id,
    forum_thread.CategoryId,
    forum_thread.subject,
    forum_thread.posted,
    forum_thread.last_answer,
    forum_thread.visits,
    forum_thread.locked,
    forum_thread.pinned") or die(mysql_error());
  $answer_count = mysql_num_rows($answer_sql);
 

 

Jag får ut under  "antal inlägg" = 11 i alla trådar vilket är antalet av  trådar som finns i hela forumet. på rätt väg tror jag..


ID: #16175 | Skapades: 2009-06-17 20:10:24

voigtan
voigtan

Gradering

#16176

mysql_num_rows ger bara antal rader, i ditt fall så är finns det 11 poster i ditt forum. Att få antal är $answer_sql["NumberOfAnswers"] som jag har angett i SQL frågan.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #16176 | Skapades: 2009-06-17 20:27:07

Saamir
Saamir

Gradering

#16177

Citerar voigtan:

Jag vet inte riktigt vad dina kunskaper inom SQL gå, men mysql_num_rows ger bara antal rader, i ditt fall så är finns det 11 poster i ditt forum. Att få antal är $answer_sql["NumberOfAnswers"] som jag har angett i SQL frågan.

 

Den är inte stor som du märker. Förstår inte vad du menar med $answer_sql["NumberOfAnswers"] ??

 

Vad ska stå i NumberOfAnswers?

ID: #16177 | Skapades: 2009-06-17 20:30:48

voigtan
voigtan

Gradering

#16178

Det är det alias som jag satte i SELECT satsen:

...
Count(forum_answer.threadid) NumberOfAnswers
...

Man kan skriva:

 Count(forum_answer.threadid) as NumberOfAnswers
men jag gillar inte det ;) Det blir ett extra fält, som ditt fält i första exemlet ID:
$info['id']
Hur alias fungera kan du läsa om här: http://www.w3schools.com/SQL/sql_alias.asp

Bästa tipset är att du kolla igenom SQL frågan och se att det är det du är ute efter och att du förstå vad varför man har gjort som man har gjort. Sen kopplar du in renderingen (php).

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
Redigerades av voigtan den 17 juni 2009. Läs tidigare inlägg.
ID: #16178 | Skapades: 2009-06-17 20:34:22

Saamir
Saamir

Gradering

#16179

Citerar voigtan:

Det är det alias som jag satte i SELECT satsen:

...
Count(forum_answer.threadid) NumberOfAnswers
...

Man kan skriva:

 Count(forum_answer.threadid) as NumberOfAnswers
men jag gillar inte det ;) Det blir ett extra fält, som ditt fält i första exemlet ID:
$info['id']
Hur alias fungera kan du läsa om här: http://www.w3schools.com/SQL/sql_alias.asp

Bästa tipset är att du kolla igenom SQL frågan och se att det är det du är ute efter och att du förstå vad varför man har gjort som man har gjort. Sen kopplar du in renderingen (php).

 

Okej, detta är för anvancerat för mig. Trodde inte det var såhär svårt. jag som trodde jag nästan var klar :P

blir tokig. fattar inget :P

ID: #16179 | Skapades: 2009-06-17 20:37:59

voigtan
voigtan

Gradering

#16180

Det är ju klart! (Om jag förstå din grund fråga)

Du behöver bara min SQL fråga för att rendera ut alla trådar i ditt forum, och du har fått en nytt fält med namnet NumberOfAnswers som du kan använda som vilket fält som hellst i ditt "RecordSet".

$sql = "SELECT ft.Id, ft.CategoryId, ft.subject, ft.posted, ft.last_answer, ft.visits,ft.locked, ft.pinned, Count(fa.threadid) NumberOfAnswers FROM forum_thread ft LEFT JOIN forum_answer fa ON ft.Id = fa.threadid GROUP BY ft.Id, ft.CategoryId, ft.subject, ft.posted, ft.last_answer, ft.visits, ft.locked, ft.pinned"
$forumThreads = mysql_query($sql) or die(mysql_error());
Så loopar du ut $forumThreads som man brukar göra.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #16180 | Skapades: 2009-06-17 20:50:35

Saamir
Saamir

Gradering

#16181

.,..

ID: #16181 | Skapades: 2009-06-17 20:51:28
Sida: 1 2
© Copyright 2007-2009 Shadi Domat | Version 3.0 | Sidkarta | Policy