[PHP] Zelfde resultaten zoek query

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
Hey iedereen,

Ik heb het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
$sql = "SELECT * FROM " . $table_msgs . " t1, " . $table_replies . " t2 WHERE ";
$sql .= "MATCH(t1.topic) AGAINST('%" . $_GET['q'] . "%') ";
$sql .= "OR MATCH(t1.msg) AGAINST('%" . $_GET['q'] . "%') ";
$sql .= "OR MATCH(t2.msg) AGAINST('%" . $_GET['q'] . "%') ";
$sql .= "LIMIT 0,50";
$res = mysql_query($sql);

while ($row = mysql_fetch_array($res))
{
    echo $row['id'] . "-" . $row['tid'] . "<br />";
}


Let niet op * want dat wordt uiteraard nog veranderd.. :)

Mijn vraag:
Simpele search met een limiet van 50 topics. Echter doet hij het niet goed. Hij geeft dubbele resultaten weer.

Ik heb twee tabellen. Eén voor de TOPICS en één voor de REACTIES. Ik gebruik 'id' en 'tid'. Dit kan ik niet meer wijzigen en dat wil ik ook niet.

ID staat voor het id nummer van de record
TID staat voor het 'hoofd topic' waar hij naar moet verwijzen

Je snapt het misschien al, er komen veelvoudig dezelfde TID terug waardoor ik dubbele resultaten krijg. Ook krijg ik wel eens ID = 4, en dan later nog een keer TID = 4. Dat mag ook niet. Deze kan ik eruit filteren via PHP en weet ook hoe dit moet, alleen wil ik dit alvast via MySQL doen.

Ik heb op dit forum gezocht en gekeken op mysql.com (misschien niet goed genoeg) maar kom er niet uit.

Ik wil dus zodra dat ID=4 voor is gekomen, hij niet meer TID=4 mag weergeven. Ik wil ook niet dat wanneer TID=10 is, hij nog een keer een record pakt waar TID=10 en ook niet waar ID=10 uit de tabel met TOPICS.

Ik vind het erg moeilijk maar misschien heeft iemand hier ervaring mee die mij kan helpen.. Alvast bedankt :)

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Misschien moet je in je query dan even aangeven waarop die twee tabellen gelinked zijn?

WHERE t1.replyID=t2.ID

bijvoorbeeld.

[ Voor 40% gewijzigd door Bosmonster op 21-02-2006 11:51 ]


Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
mwja..

maar als ik dan heb:
code:
1
2
3
4
5
6
$sql = "SELECT * FROM " . $table_msgs . " t1, " . $table_replies . " t2 WHERE ";
$sql .= "t2.tid != t1.id AND (";
$sql .= "MATCH(t1.topic) AGAINST('%" . $_GET['q'] . "%') ";
$sql .= "OR MATCH(t1.msg) AGAINST('%" . $_GET['q'] . "%') ";
$sql .= "OR MATCH(t2.msg) AGAINST('%" . $_GET['q'] . "%')) ";
$sql .= "LIMIT 0,50";
Bijvoorbeeld.. Dan pakt hij niet een TID die gelijk is aan t1.ID.. Maar dat gaat niet werken.. Want als hij eerst ID = 10 pakt, dan 20 andere results geeft en dan weer een TID = 10 geeft.. dat kan.. en dat mag dan dus niet..

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Het is me niet helemaal duidelijk wat je wil doen.
Zoek je zoiets?
code:
1
2
3
4
5
6
7
8
1   1
1   2
1   3

2   1
2   2

3   1

Nu met Land Rover Series 3 en Defender 90


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Zenda schreef op dinsdag 21 februari 2006 @ 11:56:
mwja..

maar als ik dan heb:
code:
1
2
3
4
5
6
$sql = "SELECT * FROM " . $table_msgs . " t1, " . $table_replies . " t2 WHERE ";
$sql .= "t2.tid != t1.id AND (";
$sql .= "MATCH(t1.topic) AGAINST('%" . $_GET['q'] . "%') ";
$sql .= "OR MATCH(t1.msg) AGAINST('%" . $_GET['q'] . "%') ";
$sql .= "OR MATCH(t2.msg) AGAINST('%" . $_GET['q'] . "%')) ";
$sql .= "LIMIT 0,50";
Bijvoorbeeld.. Dan pakt hij niet een TID die gelijk is aan t1.ID.. Maar dat gaat niet werken.. Want als hij eerst ID = 10 pakt, dan 20 andere results geeft en dan weer een TID = 10 geeft.. dat kan.. en dat mag dan dus niet..
Ik zeg toch ook = en niet !=

Als je de link niet aangeeft krijg je het product van de twee tabellen. Dit is wel heel erg basic database kennis hoor :)

Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
Nee..

Ik krijg dit als resultaat:

1 = ID nummer hoofdtopic - 0 = hoofdtopic
2 = ID nummer hoofdtopic - 0 = hoofdtopic
24 = ID nummer reactie topic - 4 = ID nummer hoofdtopic (hier staat hij aangelinkt)

HIerboven is perfect.. maar ik krijg soms dit als resultaat

1 - 0 (goed, uniek, topic tabel)
2 - 0 (goed, uniek, topic tabel)
3 - 2 (niet goed, niet uniek, reactie tabel)

3e resultaat komt uit de reactie tabel. Hij linkt hier naar ID nummer 2. Maar die result is er al (2e result). Ik wil dus dat er geen dubbele resultaten mogelijk zijn. Dus tweede resultaat (na -) moet uniek zijn en mag niet voorkomen in de topic tabel.. (voor -)

Zo wat duidelijker?! :)

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
Bosmonster schreef op dinsdag 21 februari 2006 @ 12:16:
[...]


Ik zeg toch ook = en niet !=

Als je de link niet aangeeft krijg je het product van de twee tabellen. Dit is wel heel erg basic database kennis hoor :)
Volgens mij snap je me niet helemaal. Het gaat om een forum met duizende topics uit twee tabellen. Als ik als result uit 1e tabel 100 heb, mag hij niet uit het tweede tabel TID = 100 halen.

Dus als ik zeg, waar TID = gelijk aan ID, dan moet hij perse matchen. :)

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Hmm.. ok weer eens niet goed gelezen dan :P

Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
Om het nog duidelijker te maken. Dit krijg ik terug als ik zoek op 'test':

186 - 22
452 - 65
608 - 87
1263 - 167
1323 - 174
1358 - 176
1397 - 181
1398 - 181
1400 - 183
1401 - 183
1402 - 181
1405 - 182
1406 - 184
1407 - 182
1457 - 193
1540 - 188
1590 - 210
1668 - 226
1958 - 278
1959 - 278
2149 - 291
2150 - 291
2318 - 320
2395 - 339
2520 - 360
2787 - 391
2824 - 396
2829 - 396
3028 - 408
3055 - 416
3072 - 416
3086 - 416
3110 - 437
3156 - 439
3170 - 448
3330 - 485
3420 - 501
3423 - 501
3690 - 546
3963 - 589
3967 - 589
3970 - 589
3980 - 589
4016 - 601
4017 - 601
4177 - 633
4192 - 633
4196 - 633
4201 - 633
4203 - 633


Zoals te zien is, zijn er dubbele resultaten bij de tweede rij. Dat mag niet. Dit moet uniek zijn. Ook mag een nummer uit de tweede rij, niet overeenkomen met één uit de eerste rij.

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • kalechinees
  • Registratie: Mei 2005
  • Laatst online: 21-04 15:02
Waarom gebruik je geen Join functie? Hiermee worden dubbele of lege waarden sowieso niet meegenomen.
http://gathering.tweakers...ist_messages/741009#joins

je kunt natuurlijk ook altijd een distinct functie gebruiken... alhoewel het natuurlijk wel erg ranzig is :)

sorry, loop te blaten :) Volgens mij krijg je dit niet in 1 query gestopt (of wel maar ik heb geen idee) en zou hier 2 queries van maken.

Je zou evt ipv de "select *" een "select distinct TID" kunt gebruiken.

[ Voor 64% gewijzigd door kalechinees op 21-02-2006 13:08 ]


Acties:
  • 0 Henk 'm!

  • seamus21
  • Registratie: December 2001
  • Laatst online: 24-02-2018
Zet op beide resultaten id en tid een DISTINCT ervoor.

PHP:
1
select DISTINCT id, DISTINCT tid from tabel1, tabel2

[ Voor 11% gewijzigd door seamus21 op 21-02-2006 12:56 ]

Always shoot for the moon. Even if you miss you will land among the stars...


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

DISTINCT werkt op recordniveau, niet op veldniveau.

Wat wel kan is GROUP BY gebruiken, maar dat betekent wel dat je een aggregate functie erin moet verwerken. Beetje een lapmiddel dus. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • seamus21
  • Registratie: December 2001
  • Laatst online: 24-02-2018
-NMe- schreef op dinsdag 21 februari 2006 @ 13:43:
DISTINCT werkt op recordniveau, niet op veldniveau.

Wat wel kan is GROUP BY gebruiken, maar dat betekent wel dat je een aggregate functie erin moet verwerken. Beetje een lapmiddel dus. :)
Ja so? Wat ik tikte was maar een voorbeeld. Maar als je op bijvoorbeel de topics een DISTINCT zet krijg je in ieder geval unieke topics terug.

Always shoot for the moon. Even if you miss you will land among the stars...


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

seamus21 schreef op dinsdag 21 februari 2006 @ 13:46:
Ja so? Wat ik tikte was maar een voorbeeld. Maar als je op bijvoorbeel de topics een DISTINCT zet krijg je in ieder geval unieke topics terug.
DISTINCT kun je niet op topics zetten, DISTINCT zet je op je hele query. Het keyword mag sowieso maar één keer in je query voorkomen. Met DISTINCT is er gewoon geen mogelijkheid om het volgende samen te voegen tot één rij in je resultset:
4177 - 633
4192 - 633
4196 - 633
4201 - 633
4203 - 633

Dat heeft gewoon de simpele reden dat die records verschillend zijn, ook al zijn een paar velden hetzelfde. Ze zijn dus al 'distinct'.

[ Voor 5% gewijzigd door NMe op 21-02-2006 13:49 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • seamus21
  • Registratie: December 2001
  • Laatst online: 24-02-2018
-NMe- schreef op dinsdag 21 februari 2006 @ 13:49:
[...]

DISTINCT kun je niet op topics zetten, DISTINCT zet je op je hele query. Het keyword mag sowieso maar één keer in je query voorkomen. Met DISTINCT is er gewoon geen mogelijkheid om het volgende samen te voegen tot één rij in je resultset:
4177 - 633
4192 - 633
4196 - 633
4201 - 633
4203 - 633

Dat heeft gewoon de simpele reden dat die records verschillend zijn, ook al zijn een paar velden hetzelfde. Ze zijn dus al 'distinct'.
Waarom zou alles in 1 select moeten dan? UNION?

Je maakt een DISTINCT op de topics UNION en een DISTINCT op de replies.

[ Voor 9% gewijzigd door seamus21 op 21-02-2006 13:51 ]

Always shoot for the moon. Even if you miss you will land among the stars...


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je UNION gebruikt heb je al überhaupt geen DISTINCT meer nodig, omdat UNION sowieso al alle dubbele records uitfiltert, tenzij je UNION ALL gebruikt. ;) Maar inderdaad, UNION zou wel eens uitkomst kunnen bieden.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • seamus21
  • Registratie: December 2001
  • Laatst online: 24-02-2018
-NMe- schreef op dinsdag 21 februari 2006 @ 13:54:
Als je UNION gebruikt heb je al überhaupt geen DISTINCT meer nodig, omdat UNION sowieso al alle dubbele records uitfiltert, tenzij je UNION ALL gebruikt. ;) Maar inderdaad, UNION zou wel eens uitkomst kunnen bieden.
Maar dan kan je dus nog wel dit krijgen als je geen DIST gebruikt?

topicid - replyid
1 - 2
1 - 3
2 - 4

En dan heb je dus 2 dezelfde topicid's. Of wordt die 1-3 eruit gehaald?

[ Voor 6% gewijzigd door seamus21 op 21-02-2006 14:02 ]

Always shoot for the moon. Even if you miss you will land among the stars...


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

seamus21 schreef op dinsdag 21 februari 2006 @ 14:00:
Maar dan kan je dus nog wel dit krijgen als je geen DIST gebruikt?

topicid - replyid
1 - 2
1 - 3
2 - 4

En dan heb je dus 2 dezelfde topicid's. Of wordt die 1-3 eruit gehaald?
Nee, want dat record verschilt van 1 - 2. Maar dat kun je ook met een UNION niet tegengaan. Je kan toch niet eerst de linkerkolom ophalen in één query, dan de rechterkolom in een andere en die met UNION koppelen? Je zal gewoon met dezelfde recordlayout moeten werken, en die records zijn dus, zoals ik hierboven al zei, verschillend.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • seamus21
  • Registratie: December 2001
  • Laatst online: 24-02-2018
-NMe- schreef op dinsdag 21 februari 2006 @ 14:22:
[...]
Nee, want dat record verschilt van 1 - 2. Maar dat kun je ook met een UNION niet tegengaan. Je kan toch niet eerst de linkerkolom ophalen in één query, dan de rechterkolom in een andere en die met UNION koppelen? Je zal gewoon met dezelfde recordlayout moeten werken, en die records zijn dus, zoals ik hierboven al zei, verschillend.
Maar dit?
PHP:
1
2
SELECT DISTINCT id AS topicid from topic UNION
SELECT DISTINCT id AS replyid from reply

Zou toch het goede resultaat moeten opleveren?

topicid - replyid
1-2
2-4
3-5
10-38

Je krijgt van de linker select alle topics terug met met dubbele eruit gehaald. En van de rechter alle replies met dubbele eruit gehaald. Maar als je het op deze manier doorzoekt heb je zo ie zo geen DISTINCT nodig want je kan nooit dezelfde topicid's terugkrijgen of replyid's tenzij deze niet uniek zijn in je tabellen. Ik neem aan dat in topic niet twee keer het id 2 in voorkomt ofzo.

Always shoot for the moon. Even if you miss you will land among the stars...


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Nee, je krijgt dan deze resultset:
topicid
1
2
3
10
4
5
38

UNION is helemaal niet gemaakt voor waarvoor jij het hier wil gebruiken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:47

edeboeck

mie noow noooothing ...

-NMe- schreef op dinsdag 21 februari 2006 @ 15:15:
<snip>
UNION is helemaal niet gemaakt voor waarvoor jij het hier wil gebruiken.
Ik ben het in principe met je eens, maar misschien is het toch wel bruikbaar en zelfs nuttig in dit geval?
PHP:
1
2
3
4
5
6
7
$sql = "SELECT DISTINCT id FROM " . $table_msgs . " t1 WHERE ";
$sql .= "MATCH(t1.topic) AGAINST('%" . $_GET['q'] . "%') ";
$sql .= "OR MATCH(t1.msg) AGAINST('%" . $_GET['q'] . "%') ";
$sql .= "UNION";
$sql .= "SELECT tid FROM " . $table_replies . " t2 WHERE ";
$sql .= "MATCH(t2.msg) AGAINST('%" . $_GET['q'] . "%')) ";
$sql .= "LIMIT 0,50";

Dit levert je alle id's op van topics waarin je zoekterm aan bod komt ... op basis van deze id's kan je dan nog extra info ophalen.

Waar ik niet volledig zeker van ben, maar dat kan TS wschl vrij snel opsnorren:
* of DISTINCT gebeurt na de UNION ... ik dacht van wel ...
* of LIMIT wel terugslaagt op de volledige query en niet enkel het tweede gedeelte ... ook hier dacht ik van wel

Acties:
  • 0 Henk 'm!

  • ZjieB
  • Registratie: Juli 2002
  • Laatst online: 27-09-2024
offtopic:

is dit een voorbeeldje? anders zou ik de input wel valideren ivm injection...

Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
He bedankt voor de reacties allemaal..

Ik zal eens met UNION proberen, had het zelf net ook al gelezen op mysql.com. En zal straks ook even proberen met de voorbeelden die gegeven zijn en met GROUP BY.

Ik hou jullie op de hoogte.. Bedankt voor zover!

Wordt uiteraard wel gecontroleerd op injection :)

[ Voor 10% gewijzigd door Zenda op 21-02-2006 18:20 ]

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • seamus21
  • Registratie: December 2001
  • Laatst online: 24-02-2018
-NMe- schreef op dinsdag 21 februari 2006 @ 15:15:
Nee, je krijgt dan deze resultset:
topicid
1
2
3
10
4
5
38

UNION is helemaal niet gemaakt voor waarvoor jij het hier wil gebruiken.
LOL. Ik ga gelijk wat UNIONS in mysql uitproberen dan. Ik krijg namelijk met mijn unions wel altijd het resultaat wat ik wil. Sterker nog. Ik maak nu 2 tabellen topic en reply en ga ff wat unions testen :) :)

Edit: Ah ok klopt als een bus. Ik heb alleen maar UNIONS gebruikt waarbij ik verschillende veldnamen e.d. had.

Ben zeer benieuwd naar de oplossing :)

[ Voor 16% gewijzigd door seamus21 op 22-02-2006 00:27 . Reden: eene dit regel bijgevoegd. ]

Always shoot for the moon. Even if you miss you will land among the stars...

Pagina: 1