[php / mysql] moeilijke query

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een tabel van een soort gastenboek ("laat jouw mening achter") met daarin dus een id, gebruikers_id en het berichtje (longText).

In deze berichtjes wordt gepraat over de namen van personen.
Hoe kan ik nu een query uitvoeren die laat zien welke naam het meest voorkomt in de berichtjes?

Dus stel er zijn 4 rijen met een berichtje dat "Karel Appel" bevat, 3 met daarin de naam "Kees de Groot" en 1 rij met daarin de naam "Piet Puk".

Hoe kan ik deze gegevens nu met een query selecteren? Dus dat ik een rijtje kan maken:

1. Karel Appel -> 4
2. Kees de Groot -> 3
3. Piet Puk -> 1

Grootste probleem is dat ik de namen niet weet waar het over gaat, dus hij moet gewoon de woorden gaan vergelijken, en soms zijn dit ook meerdere woorden (Kees De Groot, 3 woorden dus).

Is dit uberhaubt wel mogelijk?

Het maakt me nog niet eens zoveel uit als er ook gewone woorden tussen het lijstje komen, dus iets als:

1. de -> 13
2.een -> 16
3. Kees -> 3
4. enz

Ik heb geen idee of het eigenlijk wel kan. Zou er een query voor zijn? En zo ja, wordt die dan niet te log qua cpu-verbruik?
Ik heb het idee dat dit al eens eerder voorbij is gekomen trouwens.

Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
SELECT count(*) FROM table_name where bericht LIKE '%Karel Appel %'

zowiets?

Acties:
  • 0 Henk 'm!

  • frankivo
  • Registratie: Januari 2002
  • Laatst online: 02-06 13:53
4Real schreef op 18 August 2003 @ 10:34:
SELECT count(*) FROM table_name where bericht LIKE '%Karel Appel %'

zowiets?
zou kunnen, maar dan moet je voor elke gebruiker een query versturen (dmv een while).
alleen als je veel gebruikers hebt schiet dat ook niet op :+

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Kun je niet gewoon een inner join maken met dat like query? Ik weet niet zeker of dat mag in mysql. En dan gewoon een group by en count er in en klaar is Karel Appel.

Anders kun je ook een vieze manier gebruiken, gewoon alle namen ophalen en daarna achter het query plakken. Dus:
PHP:
1
2
3
4
$sql="SELECT count(*) FROM table_name where";
while(loop mysql result){
     $sql.="OR bericht LIKE '%".$username."%'";
}

[ Voor 11% gewijzigd door djluc op 18-08-2003 10:44 ]


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

- De namen die moeten worden vergeleden weet je niet.
- De namen kunnen 1, 2, 3 of zelfs meer woorden bevatten (ook 'de' enzo).
- Hoevaak de namen voor komen weet je ook niet.

Ben geen SQL held ofzo, maar het lijkt mij haast onmogelijk. Stel je hebt 3 berichten:

A = Ja ik vind Karel Appel goed.
B = Nou ik haat Karel Appel.
C = Karel Apel is minder goed als van Gogh.

Dat levert op:
2x Karel Appel
1x Karel Apel
3x Karel
2x Appel
1x Apel
1x Gogh

En de enigste manier om hier achter te komen is volgens mij door alle losse woorden in een Array te zetten met als waarde hoevaak die voor komt. En steeds te vergelijken met het volgende bericht te vergelijken.. Dit is, als je 1000 berichten hebt, al bijna niet te doen.
En dan moet je ook nog rekening houden met spelfouten en dus ook met dat de ene Karel Appel typt en de andere alleen Appel ofzo.

Maar misschien dat de optie zoals hier op GoT voor het zoeken, die aangeeft hoeveel % jouw zoekwoord en het resultaat gelijk is, dat je daar iets mee kunt doen.
Denk alleen dat het grootste probleem nog is, dat je niet weet welke woorden/namen het zijn.

[ Voor 18% gewijzigd door OkkE op 18-08-2003 11:40 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 17-09 12:10
Dan lijkt me nog wel een veld met 'onderwerp' een makkelijke manier.
Dan kun je daar op zoeken. En een apart veld of het een positief of negatief bericht is. :?

let the past be the past.


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

SPee schreef op 18 August 2003 @ 11:44:
Dan lijkt me nog wel een veld met 'onderwerp' een makkelijke manier.
Dan kun je daar op zoeken. En een apart veld of het een positief of negatief bericht is. :?
Alleen gaat het om namen (woorden) waarvan je van te voren niet kunt voorspellen hoeveel en welke in het bericht komen te staan... Tenminste, dat is wat ik er uit begrijp.

[ Voor 7% gewijzigd door OkkE op 18-08-2003 11:49 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 02:03

JaQ

De enige manier die ik kan bedenken is in je php script direct na je insert in die gastenboek tabel een tweede insert doen in een "keyword" tabel. Je kan namelijk de string die je insert opknippen in losse woorden (scheidingsteken = spatie) en vervolgens dus op die 2e tabel een select count(*), keyword from keywords group by keyword kunnen doen.

De nuttigheid van je informatie zal echter zo ongeveer 0 worden. (tenzij je weer een restricted-keyword list gaat bijhouden, maar dan nog, eigenlijk wil je dit niet)

[ Voor 21% gewijzigd door JaQ op 18-08-2003 11:57 . Reden: toevoeging ]

Egoist: A person of low taste, more interested in themselves than in me


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OkkE schreef op 18 August 2003 @ 11:48:
[...]

Alleen gaat het om namen (woorden) waarvan je van te voren niet kunt voorspellen hoeveel en welke in het bericht komen te staan... Tenminste, dat is wat ik er uit begrijp.
Je moet het zo voor je zien; mensen kunnen een reactie geven over een artikel, en in deze reacties kan gediscussieerd worden over mensen. Over welke mensen weet je niet van te voren, en gezien de complexheid van het script wat hiervoor nodig zou zijn denk ik dat het een beetje onmogelijk is om bij te gaan houden over welke mensen het meest gepraat wordt..

[ Voor 6% gewijzigd door Verwijderd op 18-08-2003 12:11 ]


Acties:
  • 0 Henk 'm!

  • apa
  • Registratie: April 2001
  • Laatst online: 17-09 10:29

apa

Run Forest, ruuuuuuuuuunnnnn!!

Je kan een CURSOR maken; dan zal dat wellicht wel lukken, maar 't zal alles behalve proper zijn en qua performantie zal het nog een stuk erger gesteld zijn.

De properste oplossing is een 2de tabel aanmaken met de keywords die je wil bijhouden. Je kan die eventueel zelf (manueel) opvullen, of je kan dat in script doen (best bij het inserten)... Daarna moet je enkel nog een COUNT(*) doen met een GROUP BY <woordveld> op die 2de tabel.

Om niet met een tabel met een paar miljoen rijen over te blijven, zou je ook een tabel "stats" kunnen maken waarin je voor ieder gevonden woord de COUNT bijhoudt. Wanneer een nieuw bericht wordt toegevoegd, ga je de COUNT's updaten.

PC: R5-2600X | X370-Pro | 2x8GB | 960Pro 512GB | WD 4TB | GTX 660 | Eizo CX240 | Steinberg UR22MkII | JBL LSR305


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Ik denk dat toch het simpelste is, een tabel maken met alle namen, en die dan steeds handmatig aanvullen. En met die waardes een COUNT query uitvoeren om te kijken hoevaak die namen voor komen.
Dit is natuurlijk niet te doen bij een grote site met veel bezoekers, maar een script schrijven dat (bijna) geen fouten maakt is zoveel werk (haast onmogelijk?) ...

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

Verwijderd

Maak een 'gast' tabel aan waarin je 'id' en 'naam' zet met daarachter 'naam_count'.

Vervolgens scan je elke post die langskomt op elke mogelijke 'naam' (met: or like) enventueel met een distinct.

Hieruit krijg je allemaal id's. Vervolgens verhoog je count in de gast-tabel waarvan de id's langs waren gekomen. Zo kun je met een max query, de meest besproken gast eruit pikken, mits er geen splevaude gemaakt worden.

Hoeveel gasten verw8 je eigenlijk te krijgen? Zodra het je site begint te vertragen(te veel users of te veel berichten per seconde), kun je een batch script schrijven die in een keer alle berichten van een bepaalde datum doorloopt en dan de naam_count ophoogt. Dit zou bijvoorbeeld een nachtje kunnen draaien.

Ook zou je een datum('last_active' in 'gast') kunnen updaten zodra je een 'naam_count' verhoogt. En als bijvoorbeeld een user al 2 maanden niet besproken is geweest of heeft gepost, dat hij dan niet meer als active user beschouwd wordt en hij niet meer interessant is. Zo kun je heel veel uitsluiten.
Pagina: 1