[php/mysql]2 tables selecteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig aan een zoek-script voor mijn site, maar ben een probleem tegen gekomen waar ik geen oplossing op kan vinden.
het volgende is het probleem:

ik moet voor de results van het zoeken uit 2 verschillende tables selecteren dat is opzich niet zo`n probleem maar allebij de tables hebben een rij: cod maar allebij die rijen zijn voor iets anders, de ene is het ID van het bijbehorende resultaat, en de andere is het ID van de category. het gevolg hiervan is dat ie een verkeerd ID geeft aan het zoek resultaat. Hoe kan ik ervoor zorgen dat allebij de cods worden onderscheiden?

hier zijn de tables en een stukje script waar het in moet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CREATE TABLE wt_news (
  cod int(10) unsigned NOT NULL auto_increment,
  category int(10) unsigned NOT NULL default '0',
  date datetime NOT NULL default '0000-00-00 00:00:00',
  title varchar(80) NOT NULL default '',
  userid int(10) unsigned NOT NULL default '0',
  image varchar(40) NOT NULL default 'none',
  align varchar(20) NOT NULL default 'left',
  active char(1) NOT NULL default 'N',
  counter int(10) unsigned NOT NULL default '0',
  text text,
  text_ori text,
  full_text text,
  full_text_ori text,
  archived enum('Y','N') NOT NULL default 'N',
  PRIMARY KEY  (cod),
  KEY date (date)
) TYPE=MyISAM;

&

CREATE TABLE wt_newscat (
  cod int(10) unsigned NOT NULL auto_increment,
  name varchar(30) NOT NULL default '',
  image varchar(40) NOT NULL default '',
  PRIMARY KEY  (cod)
) TYPE=MyISAM;

stukje script:

$query="select * from wt_news, wt_newscat WHERE title LIKE \"%".$keyword."%\" ORDER by title ASC";


Alvast bedankt _/-\o_


ps. ik heb allebij de cods nodig 8)7

Acties:
  • 0 Henk 'm!

  • Vae Victis
  • Registratie: April 2001
  • Laatst online: 07-09 06:15

Vae Victis

Dark Lord of the Sith

SELECT wt_news.cod AS cod1,wt_newscat.cod AS cod2 FROM ....

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je kan niet zomaar twee tabellen pakken en hopen dat ze "onder elkaar" gezet worden.
Als je geen mysql 4 gebruikt zul je dat met twee losse queries moeten oplossen, anders kan je een union gebruiken.

Je krijgt nu dan ook een carthetisch product van al het nieuws met de goede titel en daaraanvast alle wt_newscat's.

edit:

ik bedenk me dat ik je verhaal helemaal niet snap, wat is dat voor geklets dat de cod's niet gelijk zijn enzo :? Wat is het nut dan om ze beide dezelfde naam te geven en allebei nodig te hebben?

Wat probeer je uberhaupt met je query te bereiken? :)

[ Voor 53% gewijzigd door ACM op 24-05-2003 16:44 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

• Allereerst: je krijg bij deze query een carthetisch product. Je voert namelijk een cross JOIN uit po de 2 tabellen wt_news en wt_newscat waar je dus een vermenigvuldigd resultaat krijgt.

Gebruik dus een JOIN om uit de 2 tabellen te selecteren. Zie voor uitleg over joins de FAQ.

• Ten tweede: je selecteert alle velden terwijl je ze waarschijnlijk niet allemaal gebruikt. Geef de velden expliciet op:
code:
1
2
3
SELECT
   `table1`.`veld1`,
    # etcetera


• Ten derde, je kunt aliases opgeven voor velden:
code:
1
2
3
4
SELECT
   `table1`.`veld1`      AS `table1_veld1`,
   `table2`.`veld1`      AS `table2_veld1`
    # etcetera

[ Voor 1% gewijzigd door drm op 24-05-2003 16:47 . Reden: kommaatje ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok ik zal het eens proberen, de rede dat er 2 cods zijn weet ik ook niet, ik bouw zelf een module op een al bestaand portal systeem.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, het werkt op de manier als Vae Victis zei.

code:
1
2
3
4
5
$query="select wt_news.title, wt_news.date, wt_news.category, 
wt_newscat.image, wt_news.cod AS cod1,wt_newscat.cod AS cod2  from 
wt_news, wt_newscat WHERE title LIKE \"%".$keyword."%\" and 

wt_newscat.cod=wt_news.category ORDER by title ASC";


bedankt :)

[ Voor 8% gewijzigd door Verwijderd op 24-05-2003 17:07 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Nog een tip: lijn je code uit, wees consequent in kleine en hoofdletters en gebruik duidelijke aliases Dit is niet te lezen ;)

Denk aan zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$query="
   SELECT
      wt_news.title,
      wt_news.date,
      wt_news.category, 
      wt_newscat.image,
      wt_news.cod    AS news_cod,
      wt_newscat.cod AS cat_cod
   FROM 
      wt_news,
      wt_newscat
   WHERE
      title LIKE \"%".$keyword."%\" 
   AND 
      wt_newscat.cod=wt_news.category
   ORDER BY 
      title ASC
";

Geloof me dat het je een hoop zoekwerk gaat besparen bij bugs.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok, ik ben een Noob dus ik was inderdaad nog niet erg consequent bezig, maar wat betekend carthetisch product? :S

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Dat je van alle categorien een veld terugvindt met daarbij alle producten, omdat er in de query niet aangegeven staat met welk product je welke categorie wilt associeren:

Stel je hebt 2 tabellen:
product:
code:
1
2
3
4
5
6
cat_id  prod_id prod_name
--------------------
1   1   product A
1   2   product B
2   3   product C
2   4   product D


category:
code:
1
2
3
cat_id  cat_name
1   Category A
2   Category B


Vervolgens ga je uit die tabellen alles selecteren:
code:
1
2
3
4
5
SELECT
   *
FROM
   product,
   category


Het resultaat is, omdat je geen relatie aangeeft, dat elk product geassocieerd wordt met elke categorie (dat heet een carthetisch of carthesiaans product):

code:
1
2
3
4
5
6
7
8
9
cat_id  cat_id  prod_id cat_name    prod_name
1   1   1   Category A  product A
1   1   2   Category A  product B
1   2   3   Category A  product C
1   2   4   Category A  product D
2   1   1   Category B  product A
2   1   2   Category B  product B
2   2   3   Category B  product C
2   2   4   Category B  product D


code:
1
2
3
4
5
6
7
SELECT
   *
FROM
   product,
   category
WHERE
   product.cat_id=category.cat_id


Je ziet dat als je tabellen wat groter worden dat behoorlijk uit de klauwen kan lopen. En wat nog erger is: je hebt niets aan die informatie, want de relaties die je uiteraard wel wilt weten komen niet terug in het resultaat.

Wat je in je 2e voorbeeld deed was in de WHERE aangeven wat de relatie was. MySQL gaat dan na welke records uit de resultset voldoen aan die relatie.
html misbruik O-)
code:
1
2
3
4
5
6
7
8
9
cat_id  cat_id  prod_id cat_name    prod_name
<span style="background-color:#ddd;">1  1   1   Category A  product A</span>
<span style="background-color:#ddd;">1  1   2   Category A  product B</span>
1   2   3   Category A  product C
1   2   4   Category A  product D
2   1   1   Category B  product A
2   1   2   Category B  product B
<span style="background-color:#ddd;">2  2   3   Category B  product C</span>
<span style="background-color:#ddd;">2  2   4   Category B  product D</span>

Let op de 2 'cat_id' velden resp uit category en uit product
Dat is dus het verschil tussen een resultset waar je wel en waar je niet wat aan hebt ;)



even terzijde:
Ik geloof dat als je echt JOINs gebruikt in je query dat het bij het "opzoeken" van de records uitgefilterd wordt ipv. aan het eind. Het zou dus kunnen dat een
code:
1
2
3
4
5
6
7
SELECT
   *
FROM
   table1,
   table2
WHERE
   table1.veld1 = table2.veld2

langzamer is dan
code:
1
2
3
4
5
6
7
SELECT
   *
FROM
   table1 
INNER JOIN 
   table2 
      ON(table1.veld1=table2.veld2)

maar ik weet niet of dat geoptimaliseerd wordt.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1