[php] subquery wildcard

Pagina: 1
Acties:

Onderwerpen


  • mazz
  • Registratie: November 2004
  • Laatst online: 08-06 13:48
Ik heb de database als volgt

DB spider2 met daarin een lijst met sites. vb www.test.nl
DB object met daarin alle links op een site vb www.test.nl/list?id=1

Nu is dus de bedoeling dat als in beide tabellen de site voorkomt dat er dan iets gedaan moet worden. Maar zoals je ziet staat dus in de object database een langere url.

Het moet dus zo zijn dat ze op het begin stuk dus kunnen matchen. Op www.test.nl

Nu probeer ik een query te maken maar daar moet bij IN een soort wildcard komen omdat de urls niet exact matchen. Hoe pak ik dit aan?

SELECT url FROM object where url IN (SELECT site FROM spider2 where site like 'www.test.nl%' )

20 jaar, en wat had ik bereikt?


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
SQL:
1
2
3
4
Select `object`.`url`, `spider2`.`site`
from `object`
inner join `spider2`
  on left(`spider2`.`site`, length(`object`.`url`)) = `object`.`url`

Zoiets?

[ Voor 24% gewijzigd door RobIII op 27-11-2008 19:08 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • mazz
  • Registratie: November 2004
  • Laatst online: 08-06 13:48
Bedankt voor je input.
Helaas werkt het niet helemaal. Het lijkt alsof ie object wil selecteren als een tabel ofzo?

Kun je misschie ietsje verder helpen? De volgende fout krijg ik
#1054 - Unknown column 'object.site' in 'field list'

20 jaar, en wat had ik bereikt?


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
mazz schreef op donderdag 27 november 2008 @ 19:10:
Bedankt voor je input.
Helaas werkt het niet helemaal. Het lijkt alsof ie object wil selecteren als een tabel ofzo?

Kun je misschie ietsje verder helpen? De volgende fout krijg ik
#1054 - Unknown column 'object.site' in 'field list'
Als ik afga op jouw tabel en veldnamen (dus aangenomen dat je een tabel "object" hebt met een veld 'site' daarin en een tabel "spider2" met daarin een veld 'url') moet het gewoon kloppen. Ik doe een join zodat ik beide tabellen koppel en dan join ik op left(`spider2`.`site`, length(`object`.`url`)) = `object`.`url` wat zoveel betekent als matchen op de eerste zoveel tekens (zoveel = lengte van de url zonder toevoegingen) en dat is net de crux; de rest boeit niet.

De melding geeft overigens duidelijk aan dat 'ie het veld niet kent dus of je hebt andere namen gebruikt voor je voorbeeld, of je doet iets anders verkeerd. Maar je probeert, volgens de melding, nu een niet-bestaand veld te selecteren.

Ik heb het zojuist getest en hier werkt het prima.

Ah, ik zie dat ik object en spider heb omgedraaid. Probeer dat eens?

code:
1
2
3
4
5
6
Tabel object:                                 Tabel spider2:
site                       foo                url                    bar
==========================================    =======================================
www.test.nl/?id=896        woei               www.google.com         345
www.tweakers.net/foo/bar   jedda123           www.test.nl            897
                                              www.tweakers.net       123


SQL:
1
2
3
4
Select `spider2`.`url`, `object`.`site`
from `object`
inner join `spider2`
  on left(`object`.`site`, length(`spider2`.`url`)) = `spider2`.`url`


Output:
code:
1
2
3
4
url               site
================================
www.test.nl       www.test.nl/?id=896
www.tweakers.net  www.tweakers.net/foo/bar


Overigens: Hoe werken joins?

Hoe dan ook: dit is een kwestie van de foutmelding even lezen en je grijze massa even gebruiken a.d.h. van de info die je hebt gekregen om het om te zetten naar jouw situatie.

[ Voor 58% gewijzigd door RobIII op 27-11-2008 20:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • mazz
  • Registratie: November 2004
  • Laatst online: 08-06 13:48
Ik heb je link even bekeken en vindt het niet heel duidelijk.
Heb mijn antwoord uiteindelijk op de w3c site gevonden.
http://www.w3schools.com/Sql/sql_join.asp

Ik moest dus een left join hebben

Dit is hem uiteindelijk geworden
code:
1
2
3
4
Select `object`.`url`, `spider2`.`site`
from `object`
left join `spider2`
  on left(`spider2`.`site`, length(`object`.`url`)) = `object`.`url`


In ieder geval heel erg bedankt voor je input.

20 jaar, en wat had ik bereikt?


  • Mawlana
  • Registratie: Juli 2002
  • Nu online
* JOIN: Return rows when there is at least one match in both tables
* LEFT JOIN: Return all rows from the left table, even if there are no matches in the right table
* RIGHT JOIN: Return all rows from the right table, even if there are no matches in the left table
* FULL JOIN: Return rows when there is a match in one of the tables
Lees eens heel goed wat een LEFT JOIN doet, en wat jij precies wil bereiken. ;)

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Een left join is heel iets anders dan een inner join. Je topicstart is daar dus klaarblijkelijk niet duidelijk over, of je rommelt maar wat aan zonder te weten wat je nou eigenlijk doet. Ik zou als ik jou was toch nog eens heel goed gaan kijken naar (o.a.) joins. Las daarvan is de crux nog steeds hetzelfde gebleven; de manier waarop je de records 'koppelt' kun je blijven hanteren.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • mazz
  • Registratie: November 2004
  • Laatst online: 08-06 13:48
Je hebt gelijk.

De enige fout zat hem in de length functie. Dit kon jij natuurlijk niet weten maar de kortste waarde stond niet in
object.url maar in spider.site. Daarom kon die natuurlijk niet matchen.

En je hebt gelijk dat ik inderdaad geen left join moet gebruiken hiervoor.

De nachtjes left for dead doortrekken begint zn tol te eisen (a)

Dit is em dus geworden uiteindelijk
code:
1
2
3
4
 SELECT `object`.`url` , `spider2`.`site`
FROM `object`
INNER JOIN `spider2` ON left( `spider2`.`site` , length( `spider2`.`site` ) ) = `spider2`.`site`
LIMIT 0 , 30

20 jaar, en wat had ik bereikt?


Acties:
  • 0 Henk 'm!

  • mazz
  • Registratie: November 2004
  • Laatst online: 08-06 13:48
Net nog even getest maar ik denk dat die length functie toch niet helemaal de juiste is.

Als ik namelijk een site heb die korter is dan een een andere site in de tabel spider2 dan krijg ik dus niet matchende resulataten.

Zie hier een voorbeeld.

code:
1
2
3
4
5
6
7
8
9
10
11
12
Query:  SELECT `object`.`url` , `spider2`.`site`
FROM `object`
INNER JOIN `spider2` ON left( `spider2`.`site` , length( `spider2`.`site` ) ) = `spider2`.`site`
LIMIT 0 , 30  
 levert op:

================================
object.url                            spider2.site
http://www.test.nl                http://www.test.nl/id=xx
http://www.langerdomein.nl  http://www.test.nl/id=xx
http://www.test.nl                http://www.test.nl/id=xxx
http://www.langerdomein.nl  http://www.test.nl/id=xxx


Is er een functie die ik beter kan gebruiken hiervoor?

20 jaar, en wat had ik bereikt?


Acties:
  • 0 Henk 'm!

  • Mawlana
  • Registratie: Juli 2002
  • Nu online
code:
1
left( `spider2`.`site` , length( `spider2`.`site` ) ) = `spider2`.`site`

Die vergelijking is altijd waar. Je zou daar iets met `object`.`url` moeten doen... ;)

[ Voor 17% gewijzigd door Mawlana op 28-11-2008 14:00 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
mazz schreef op vrijdag 28 november 2008 @ 13:55:
Net nog even getest maar ik denk dat die length functie toch niet helemaal de juiste is.

Als ik namelijk een site heb die korter is dan een een andere site in de tabel spider2 dan krijg ik dus niet matchende resulataten.
Zoals ik al aangaf; je mist de crux. De length functie mankeert niets, evenals de left functie. Die doen precies wat ze moeten doen. Maar je snapt niet waarom ze gebruikt worden in mijn voorbeeld, en dat is nou net waar het om gaat.

Wat je met die length/left functie doet is het volgende:

A: http://www.google.com/sea...nG=Google+Search&aq=f&oq=
B: http://www.google.com

Je zegt dan:

Geef mij alle records waarbij de eerste Lenght( B ) tekens vanaf de linkerkant van A gelijk zijn aan B. Dus:

Geef mij alle records waarbij de eerste 21 tekens vanaf de linkerkant van A gelijk zijn aan B. Dus:

Geef mij alle records waarbij http://www.google.com uit A gelijk is aan http://www.google.com uit B.

[ Voor 29% gewijzigd door RobIII op 28-11-2008 14:04 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • mazz
  • Registratie: November 2004
  • Laatst online: 08-06 13:48
Ik begrijp wel wat die functie doet, maar het is dus niet de functie die ik nodig heb.
Want zoals wij de length functie opzetten is die dus ook waar voor andere domeinen.

Ik ga nog even wat spelen ermee bedankt tot zover

[ Voor 175% gewijzigd door mazz op 28-11-2008 14:03 ]

20 jaar, en wat had ik bereikt?


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
mazz schreef op vrijdag 28 november 2008 @ 14:01:
Ik begrijp wel wat die functie doet, maar het is dus niet de functie die ik nodig heb.
Want zoals wij de length functie opzetten is die dus ook waar voor andere domeinen.

Ik ga nog even wat spelen ermee bedankt tot zover
Again; zie mijn edit. Je snapt het nog steeds niet. Het heeft geen drol met LENGTH te maken, maar met het afkappen van een lange string op X tekens zodat 'ie even lang is als de korte string. Verder geeft sylvesterrr in "[php] subquery wildcard" de oplossing gewoon min-of-meer weg.

[ Voor 29% gewijzigd door RobIII op 28-11-2008 14:05 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • mazz
  • Registratie: November 2004
  • Laatst online: 08-06 13:48
Je kapt de string nu dus af met length zie ik.
Maar desondanks krijg ik alsnog geen goede output.

Het lijkt wel alsof hij hem niet afkapt.

Met deze query krijg ik bijvoorbeeld nog steeds dezelfde resultaten.

SELECT `object`.`url` , `spider2`.`site`
FROM `object`
INNER JOIN `spider2` ON left( `spider2`.`site` , length( `object`.`url` ) ) = `spider2`.`site`

Als ik in de inner join url en site omdraai krijg ik natuurlijk helemaal geen resultaten.

[ Voor 239% gewijzigd door mazz op 28-11-2008 14:23 ]

20 jaar, en wat had ik bereikt?


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Doe mij (en ons) een lol en dump eens een overzichtje/schema van je (relevante!) tabellen en de inhoud van een paar records uit die tabellen. We lullen gewoon langs elkaar af volgens mij; en zoals je gezien hebt werkt het écht. Je doet dus ook écht iets verkeerd.

[ Voor 4% gewijzigd door RobIII op 28-11-2008 14:26 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Mawlana
  • Registratie: Juli 2002
  • Nu online
code:
1
left( `spider2`.`site` , length( `object`.`url` ) ) = `spider2`.`site`

Hiermee zou je helemaal geen resultaten terug mogen krijgen. Je controleert nu of een korter deel van `spider2`.`site` gelijk is aan `spider2`.`site` ...

[ Voor 5% gewijzigd door Mawlana op 28-11-2008 14:32 ]


Acties:
  • 0 Henk 'm!

  • mazz
  • Registratie: November 2004
  • Laatst online: 08-06 13:48
ik zit nu even in dw trein
Als ik vanavond weer thuis ben dump ik ff een stukje uit de db

20 jaar, en wat had ik bereikt?


Acties:
  • 0 Henk 'm!

  • mazz
  • Registratie: November 2004
  • Laatst online: 08-06 13:48
Zoals beloofd de dump uit de db

Afbeeldingslocatie: http://img227.imageshack.us/img227/4200/dbrg1.th.jpg

De bovenste is dus de tabel spider2
De 2de is de tabel object

[ Voor 25% gewijzigd door mazz op 29-11-2008 20:33 ]

20 jaar, en wat had ik bereikt?


Acties:
  • 0 Henk 'm!

  • Mawlana
  • Registratie: Juli 2002
  • Nu online
Lees deze post van mij nog eens...

Jij moet controleren of een deel van `object`.`url` gelijk is aan `spider2`.`site`.

Acties:
  • 0 Henk 'm!

  • mazz
  • Registratie: November 2004
  • Laatst online: 08-06 13:48
Oke nu heb ik het eindelijk hoor.

In rob zn tweede post heb ik alle tabellen goed gezet en nu werkt het.
Ik dacht steeds dat het aan die length functie lag, maar dat had er niets mee te maken.

Dit is het nu geworden

code:
1
2
3
4
Select `spider2`.`site`, `object`.`url`
from `object`
inner join `spider2`
  on left(`object`.`url`, length(`spider2`.`site`)) = `spider2`.`site`


Zo klopt het toch?

20 jaar, en wat had ik bereikt?


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
mazz schreef op zondag 30 november 2008 @ 14:13:
Ik dacht steeds dat het aan die length functie lag, maar dat had er niets mee te maken.
Hoe vaak hebben we je gezegd dat dat het probleem niet was?
Dat weet jij beter dan wij: als het doet wat 't moet doen (en je hebt het getest met grensgevallen e.d.) dan klopt het.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • mazz
  • Registratie: November 2004
  • Laatst online: 08-06 13:48
RobIII schreef op zondag 30 november 2008 @ 15:45:
[...]

Hoe vaak hebben we je gezegd dat dat het probleem niet was?
Ben soms een beetje eigenwijs ;)
RobIII schreef op zondag 30 november 2008 @ 15:45:
Dat weet jij beter dan wij: als het doet wat 't moet doen (en je hebt het getest met grensgevallen e.d.) dan klopt het.
Het is nu goed getest en het werkt helemaal.
Toch ga ik mij wat meer inlezen over die joins. Dat is wel intressant ;)

[ Voor 12% gewijzigd door mazz op 30-11-2008 18:51 ]

20 jaar, en wat had ik bereikt?

Pagina: 1