[[my]sql] distinct in join query

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Anoniem: 3458

Topicstarter
Hoi

Ik zit al dage te kutten om een distinct voor elkaar te krijgen in een query met een join erin. Het werkt gewoon niet, de query ziet er zo uit:
code:
1
select bodies.id, bodies.headerid, bodies.user, bodies.date, bodies.forum, headers.id, headers.header, headers.replies, headers.closed from bodies left join headers on headers.id = bodies.headerid where bodies.body like '%$query%'

Met 'group by bodies.headerid' heb ik het gewenste resultaat, maar het kan volgens mij veel sneller met een distinct. Database een erg groot, dus de search query duurt nu ongeveer 4 a 5 seconde..

Wie weet hoe/waar de distinct op bodies.headerid moet staan?

BvD heel veel dank :)

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Kan je even je table structuur posten en vertellen wat je nou precies terug wilt hebben?

Acties:
  • 0 Henk 'm!

Anoniem: 3458

Topicstarter
table stuctuur hoeft niet lijkt me..

de query is opzich goed, alleen moet er nog een distinct in, meer niet.. :)

ik krijg alleen die distinct niet voor elkaar

Acties:
  • 0 Henk 'm!

Anoniem: 13673

Op dinsdag 30 januari 2001 12:31 schreef [nielsonline] het volgende:
table stuctuur hoeft niet lijkt me..
Raptorix probeert alleen maar te helpen en vraagt wat extra info...

Beetje formatten van je code kan ook geen kwaad :)

Waarom denk je dat je query sneller wordt door een distinct? Met een like zoeken gaat gewoon niet zo snel.
Welke dubbele records kunnen er voorkomen dan?

Acties:
  • 0 Henk 'm!

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 19-07 15:46

Crazy D

I think we should take a look.

SELECT DISTINCT geldt volgens mij voor de hele regel (record), dus ik denk niet dat je dat in deze query gaat lukken. (tenzij je nu als resultaat 2 volledig identieke records krijgt).
Maar helaas weet ik ook niet zo gauw hoe de query dan wel moet zijn....

Exact expert nodig?


Acties:
  • 0 Henk 'm!

Anoniem: 5948

Een distinct zal je search query echt niet versnellen hoor.. hij doorzoekt alsnog alle rows. Maar een distinct plaats je inderdaad gewoon achter de select. Maar voorkomt enkel dubbele rijen nadat je query is uitgevoerd.

Acties:
  • 0 Henk 'm!

Anoniem: 3458

Topicstarter
Op dinsdag 30 januari 2001 13:09 schreef sjako het volgende:
Welke dubbele records kunnen er voorkomen dan?
Er wordt gezocht door de reactie tabel, dus als je een thread hebt met b.v. 4 reacties, waarvan in 2 het gezochte woord voorkomt, dan zou die thread 2x voorkomen in de lijst. Maar ik maak dan denk ik maar een soort 'cache' achtig iets, een tabel met een history van searches, als er al eens op het ingevulde woord gezocht is kan ie ze dan direct uit de cache table halen.

Ik heb ook nog nooit een distinct op een join-query gezien, dus volgens mij kan het gewoon niet

Acties:
  • 0 Henk 'm!

Anoniem: 3458

Topicstarter
Op dinsdag 30 januari 2001 13:16 schreef petgun het volgende:
Een distinct zal je search query echt niet versnellen hoor.. hij doorzoekt alsnog alle rows. Maar een distinct plaats je inderdaad gewoon achter de select. Maar voorkomt enkel dubbele rijen nadat je query is uitgevoerd.
Hmm.. dan hou ik het maar op 'group by' :)

Acties:
  • 0 Henk 'm!

Anoniem: 13673

je selecteert gewoon teveel.
Als je alles wat met bodies te maken heeft eruit gooit ben je klaar.

Als je antwoord gegeven had op raptorix zijn vraag was je er zelf uitgekomen :)

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 18-07 02:20

dusty

Celebrate Life!

lijkt mij dat
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
select 
    bodies.id, 
    bodies.headerid, 
    bodies.user, 
    bodies.date, 
    bodies.forum, 
    headers.id, 
    headers.header, 
    headers.replies, 
    headers.closed 
from 
    bodies,headers
where
    bodies.body like '%$query%'
and 
    headers.id=bodies.headerid

ook gewoon zou moeten werken.

de like natuurlijk eerst want blijkbaar zijn je tabellen erg groot. Door deze optimalisatie gaat ie eerst een "temp" tabel in zijn geheugen maken met de juiste resultaten van "bodies" en daarna de juiste waarden van headers erbij halen.

anders om is trager, dit omdat hij eerst een "temp" tabel in zijn geheugen gaat maken van de 2 tabellen samen waar de id's gelijk zijn en dan pas gaat filteren op de body. (en dat scheelt veel).

Maar zoals was gezegd het zou makkelijker zijn als je zegt WAT je precies terug wilt krijgen.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • GarBaGe
  • Registratie: December 1999
  • Laatst online: 19-07 13:25
Je kan wel een DISTINCT gebruiken, maar dan moet je die ID-velden niet opnemen in de SELECT-statement... (denk ik)

Ryzen9 5900X; 16GB DDR4-3200 ; RTX-4080S ; 7TB SSD


Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Misschien domme vraag, maar heb je wel een index gemaakt op het veld waar je op zoekt?

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Ik heb zelf ff die db nagebouwt in mssql, probeer deze querie eens?

SELECT DISTINCT
Headers.ID, Headers.header, Headers.replies,
Headers.closed
FROM Bodies INNER JOIN
Headers ON Bodies.HeaderID = Headers.ID
WHERE (Bodies.Body LIKE '%blah%')

Acties:
  • 0 Henk 'm!

Anoniem: 16506

Zet een INDEX op de kolom waarop je een GROUP BY doet. Het beste een UNIQUE index, desnoods een unique index forceren door de primary key mee te nemen.

Acties:
  • 0 Henk 'm!

Anoniem: 3458

Topicstarter
Op dinsdag 30 januari 2001 13:51 schreef raptorix het volgende:
Misschien domme vraag, maar heb je wel een index gemaakt op het veld waar je op zoekt?
Ehh nee, maar die table heeft 142.430 records :)

Ik heb de headers en bodies table gezet op:
http://home.nielsonline.com/~niels/sql/

Het was eigenlijk de bedoeling om uit headers EN bodies tegelijk te selecteren, maar toen dat niet lukte heb ik iets gemaakt waarmee eerst alle headers worden gezocht en in de temporary table gegooit, daarna de bodies, en daarna alles uit de temporary table halen, ordered op topicid. Dat werkt dus opzich wel, maar redelijk traag.

Nu heb ik dit:
http://forum.nielsonline.com/newsearch.dcs

als je de eerste keer een query invult duurt het even, maar als die query al eerder ingevuld is haalt ie het uit de search-table, dus dan gaat het wel lekker snel.

Acties:
  • 0 Henk 'm!

Anoniem: 16506

O, ja, en als je een TEKST kolom op waarden wil doorzoeken (en er dus een index op zetten), kun je er het beste een CHAR(...) van maken. Een VARCHAR indexeert veel minder snel.

Een LIKE die met een % begint kan op de meeste SQL servers ALLEEN van CHAR (dus niet VARCHAR) indexen gebruik maken. Op veel SQL servers kan een LIKE "%..." query helemaal de index niet gebruiken.

Acties:
  • 0 Henk 'm!

Anoniem: 3458

Topicstarter
Het body veld staat op 'TEXT'. Maar een index gaat veel te groot worden denk ik op het body veldt..

en een unique op headerid kan niet, omdat er op 1 thread meerdere reacties zijn, en dus meerdere keren hetzelfde headerid in de database voorkomt.

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 18-07 02:20

dusty

Celebrate Life!

Als ik goed kijk wil je dus gewoon een search function hebben en de resultaten terug krijgen waar een bepaalde zoekwoord in voorkomt ?

Zoja dan heb je geloof ik een lastige oplossing gekozen.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Anoniem: 3458

Topicstarter
Ik zit echt van alles te verzinnen ja.. :)

Ik kan wel redelijk met joins overweg, maar het lukt met niet om bovenstaande voor elkaar te krijgen, of met 1 query te zoeken door de headers EN bodies table.

Wordt 'r een beetje stoned van.. :7

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 18-07 02:20

dusty

Celebrate Life!

Ik gok even op de volgende oplossing
uitgaande dat je een resultaat wilt opbouwen in welke threads het woord voorkomt (?)
code:
1
2
3
4
5
6
7
select  distinct(
          headers.id,
          headers.header
        )
  from  headers
  where headers.id=
           (select bodies.headersid from bodies where bodies.body like '%$query%');

[edit]
Oops.. mysql.. geen subqueries dus de volgende werkt alleen:
code:
1
2
3
4
5
6
7
select  distinct(
          headers.id,
          headers.header
        )
  from  headers,bodies
  where bodies.body like '%$query%'
  and   bodies.headerid=header.id;

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Anoniem: 13673

or header.header like ('%$query%')

nog even op de goede plek toevoegen en nielsonline kan met 1 query in beide tabellen zoeken op voorkomen van $query

performance... tsja het blijft mysql (gevaarlijke opmerking :) )

Acties:
  • 0 Henk 'm!

Anoniem: 3458

Topicstarter
Dusty> Ik heb hem met phpMyAdmin getest, maar hij werkt niet helemaal. Kun je met MySQL wel op die manier (select from headers,body) meerdere tables selecteren?
Error
SQL-query:

select distinct (headers.id,headers.header) from headers,bodies where bodies.body like '%superweb%' and bodies.headerid = headers.id
MySQL said: You have an error in your SQL syntax near 'headers.header) from headers,bodies where bodies.body like '%superweb%' and bodi' at line 1

Acties:
  • 0 Henk 'm!

Anoniem: 13673

je moet de ( ) weghalen.
Je krijgt dan :
code:
1
2
3
4
5
6
7
8
9
select distinct
       headers.id
,      headers.header 
from   headers
,      bodies 
where  bodies.headerid = headers.id
and   (  bodies.body like '%test%'
      or headers.body like '%test%'
      )

:)

Acties:
  • 0 Henk 'm!

Anoniem: 3458

Topicstarter
Volgens mij .... werkt het.. :):):):)

Ik ga het uitwerken, thanks allen! :)

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 18-07 02:20

dusty

Celebrate Life!

[b]Op dinsdag 30 januari 2001 18:02 Ik ga het uitwerken, thanks allen! :)
Dank aan sjako voo rhet snellere reageren dan mij :)

En sorry, beetje te snel de sql lopen tikken :)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Anoniem: 13673

Op woensdag 31 januari 2001 13:02 schreef dusty het volgende:

[..]
Dank aan sjako voo rhet snellere reageren dan mij :)

En sorry, beetje te snel de sql lopen tikken :)
8 -t, je wilt niet 24 uur per dag 14 tsjekken. Was er toch aan het struinen.

Had de or ook maar even toegevoegd, zodat nielsonline helemaal niet meer hoeft na te denken ;)

Acties:
  • 0 Henk 'm!

Anoniem: 3458

Topicstarter
Op woensdag 31 januari 2001 13:27 schreef sjako het volgende:

[..]
8 -t, je wilt niet 24 uur per dag 14 tsjekken. Was er toch aan het struinen.

Had de or ook maar even toegevoegd, zodat nielsonline helemaal niet meer hoeft na te denken ;)
:)
http://forum.nielsonline.com/search.dcs :)

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 18-07 02:20

dusty

Celebrate Life!

wat zelfs nog geen credits >:)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Anoniem: 3458

Topicstarter
Op woensdag 31 januari 2001 15:40 schreef dusty het volgende:
wat zelfs nog geen credits >:)
http://forum.nielsonline.com/topic.dcs?id=14997 ;)

Acties:
  • 0 Henk 'm!

Anoniem: 13673

een standbeeld lijkt mij ook wel grappig 8-)

je bent welkom ;)
Pagina: 1