Avatar billede razor Nybegynder
10. august 2002 - 04:24 Der er 1 løsning

Et kompliceret query

Jeg er igang med at bygge mig et forum. Jeg har to tabeller. Et til forumindlæg (forum_main) og et til brugere (users):

CREATE TABLE forum_main (
  id int(10) unsigned NOT NULL auto_increment,
  refid int(10) unsigned NOT NULL default '0',
  titel text,
  tekst text,
  tid timestamp(14) NOT NULL,
  author_id int(10) unsigned NOT NULL default '0',
  hits int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (id),
  KEY author_id (author_id),
  KEY tid (tid)
) TYPE=MyISAM;

CREATE TABLE users (
  id int(10) unsigned NOT NULL auto_increment,
  username varchar(64) NOT NULL default '',
  password varchar(64) NOT NULL default '',
  realname varchar(255) NOT NULL default '',
  email varchar(255) NOT NULL default '',
  website varchar(255) NOT NULL default '',
  notes text NOT NULL,
  adresse text NOT NULL,
  PRIMARY KEY  (id),
  UNIQUE KEY username (username)
) TYPE=MyISAM;

Det fungerer på den måde at når der oprettes en ny tråd i forummet sættes refid=0 på det pågældende indlæg. På alle svar på dette indlæg sættes refid = <id på parent indlæg>.

I mit query ønsker jeg at hente alle indlæg der har refid=0, antal svar på indlægget, forfatter id og username, oprettelsesdato, antal hits og tidspunkt, id og username for den sidst oprettede  kommentar i tråden.

Indtil videre er det også lykkedes meget godt, men den henter kun de indlæg der er svar i, og springer let hen over dem hvor der ikke er. Det kan have noget at gøre med at n_* felterne jo selvfølgelig vil blive null.

Lad mig høre om nogen kan hjælpe - her er mit query som det ser ud nu:

SELECT
  f.id,
  f.titel,
  f.hits,
  UNIX_TIMESTAMP(f.tid) as dato,
  u.username,
  f.author_id,
  COUNT(fm.id) as antal,
  u2.username as n_username,
  UNIX_TIMESTAMP(fm.tid) as n_dato,
  u2.id as n_author_id
FROM
  forum_main as f,
  users as u,
  forum_main as fm,
  users as u2
WHERE
  (u.id = f.author_id) AND
  (f.refid = '0') AND
  (fm.refid = f.id) AND
  (u2.id = fm.author_id)
GROUP BY
  f.id
ORDER BY
  f.tid DESC
LIMIT
  0,2000

På forhånd tak :)
Avatar billede limemedia Nybegynder
10. august 2002 - 05:40 #1
Hej Razor,

Korrekt, det er et query man skal holde tungen lige i munden for at skrive, men så er det også meget sjovere *g* Jeg håber jeg har fanget alle informationerne du mangler, ellers giv et skriv og jeg kigger videre

SELECT f.id, f.titel, f.hits, UNIX_TIMESTAMP(f.tid) AS dato, UNIX_TIMESTAMP(fm.tid) AS n_dato, count(fm.id) AS antal, u.username, us.username AS n_username, f.author_id, us.id AS n_author_id
FROM users AS u, forum_main AS f LEFT JOIN forum_main AS fm ON fm.refid=f.id LEFT JOIN users AS us ON us.id=fm.author_id
WHERE f.refid='0' && f.author_id=u.id
GROUP BY f.id
ORDER BY f.tid DESC
LIMIT 0,2000

Jeg undrer mig lidt over at du vælger både at lade selve spørgsmålet og threaden køre i samme tabel, jeg "plejer" at oprette to tabeller.


/ Lars
www.ljweb.com
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester