Avatar billede tipsen Nybegynder
19. august 2005 - 16:12 Der er 1 kommentar og
1 løsning

Kompliceret JOIN-query - muligt med én eller flere små?

Hej eksperter

Jeg har en lidt kompliceret forespørgsel, som jeg ikke rigtigt kan få til at makke ret, så nu prøver jeg her! Jeg er lidt i tvivl om jeg overhovedet skal forsøge at trække informationen ud i én forespørgsel eller om jeg skal bruge flere små!

Her er tabelstrukturerne for de fire involverede tabeller:

CREATE TABLE `usr_project_categories` (
  `id` int(3) unsigned NOT NULL auto_increment,
  `snr` tinyint(5) unsigned NOT NULL default '0',
  `title` varchar(255) NOT NULL default '',
  `titleurlfriendly` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;

CREATE TABLE `usr_projects` (
  `id` tinyint(3) unsigned NOT NULL auto_increment,
  `catid` tinyint(3) unsigned NOT NULL default '0',
  `snr` tinyint(5) unsigned NOT NULL default '0',
  `title` varchar(255) NOT NULL default '',
  `description` text NOT NULL,
  `url` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `categoryid` (`catid`)
) TYPE=MyISAM;

CREATE TABLE `usr_staff_details` (
  `id` tinyint(3) unsigned NOT NULL auto_increment,
  `snr` tinyint(3) unsigned NOT NULL default '0',
  `active` tinyint(3) unsigned NOT NULL default '1',
  `firstname` varchar(255) NOT NULL default '',
  `lastname` varchar(255) NOT NULL default '',
  `title_da` varchar(255) NOT NULL default '',
  `title_en` varchar(255) NOT NULL default '',
  `email` varchar(255) NOT NULL default '',
  `phone` varchar(255) NOT NULL default '',
  `imagesrc` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;

CREATE TABLE `usr_staff_projects` (
  `pid` tinyint(3) unsigned NOT NULL default '0',
  `snr` tinyint(3) unsigned NOT NULL default '0',
  `idproject` tinyint(3) unsigned NOT NULL default '0',
  PRIMARY KEY  (`pid`,`idproject`)
) TYPE=MyISAM;
?>

Feltet usr_projects.catid refererer til usr_project_categories.id, mens feltet usr_staff_projects.idproject refererer til usr_projects.id og usr_staff_projects.pid refererer til usr_staff_details.id.

Udgangspunktet for forespørgslen er et medarbejderid - dvs. en værdi for feltet usr_staff_details.id/usr_staff_projects.pid. Jeg ønsker en liste med alle poster i usr_projects - den skal indeholde:

usr_projects.id
usr_projects.title
usr_project_categories.title
0/1 - afhængig af om det aktuelle projektid er med i usr_staff_projects for den aktuelle medarbejder.
0/1 - afhængig af om navnet på medarbejderen indgår i projektbeskrivelsen, dvs. noget i retning af CONCAT('%', usr_staff_details.firstname, ' ', usr_staff_details.lastname, '%') LIKE usr_projects.description

Ovenstående beskriver vist meget godt problemstillingen, men det ville da næsten være mærkeligt, hvis det også giver mening for andre end mig, så spørg endelig, hvis der tvivl om noget!

Jeg håber, at nogen kan hjælpe med at strikke noget brugbart sammen. Jeg overvejer også om jeg skal hive de ønskede data ud i mindre bidder og derefter konstruere et array med det ønskede resultat vha. nogle manipulationer i PHP?

På forhånd tak.

Mvh Tommy Ipsen
Avatar billede kjulius Novice
19. august 2005 - 22:32 #1
Noget i retning af dette?

select p.id, p.title, c.title, case when s.id is null then 0 else 1 end as stabsprojekt, case when sd.id is null then 0 when INSTR(p.description,CONCAT(sd.firstname, ' ', sd.lastname)) > 0 then 1 else 0 end as navniprojekt
from usr_projects p
inner join usr_project_categories c on c.id=p.catid
left join usr_staff_projects sp on sp.idproject = p.id
left join usr_staff_details sd on sd.id=sp.pid

Jeg har ikke adgang til en MySQL server, så det er kun et forslag, ikke en løsning. Der er sikkert andre, som er meget bedre til det...

Desuden har jeg sikkert misforstået noget i din forklaring, men hvis du bare kan få lidt inspiration ud af det, er det da ikke helt forgæves.
Avatar billede tipsen Nybegynder
25. april 2008 - 12:01 #2
lukker
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

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