Toon posts:

[MySQL] Query uitdaging

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Misschien voor anderen geen uitdaging, voor mij wel...

Ik heb een prima werkende zoekopdracht gemaakt..

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT unspsc.unspsc_omschrijving as cat, unspsc.unspsc_omschrijving_nl as oms2,
products.artikelsoort, products.id, 
products.artikel, 
products.oem, products.omschrijving_nl as prodoms, 
 merken.omschrijving as merk 
FROM products  Inner Join merken 
ON merken.merk = products.merk Inner Join unspsc 
ON products.unspsc = unspsc.unspsc 
WHERE unspsc.unspsc>0 AND 1=1 AND
 ((products.omschrijving_nl 
LIKE '%tk%' 
OR products.omschrijving_en LIKE '%tk%' 
OR unspsc.unspsc_omschrijving LIKE '%tk%' 
OR merken.omschrijving LIKE '%tk%' 
OR products.oem LIKE '%tk%' 
OR products.artikel LIKE '%tk%' ))
ORDER BY 
merk,unspsc.unspsc_omschrijving,products.artikelsoort 


Nu moet e.e.a. uitgebreid worden met klantspecifieke artikelen. Dit zijn gewoon artikelen die voorkomen in de tabel products, maar dan met een ander artikelnummer. Om het klantartikelnummer weer te geven gebruik ik de onderstaande aanvulling

// knip

SQL:
1
2
3
4
5
6
7
8
products.artikel, 

(SELECT debiteur_artikelen.debiteurartikelnummer
FROM debiteur_artikelen
WHERE debiteur_artikelen.artikelnummer=products.artikel 
AND debiteur_artikelen.debiteur='0123' LIMIT 1) AS debartnr,

products.oem,


// knip


Voor de weergave prima, maar zoeken op het debiteurartikelnummer wil nog niet
De uitdaging zit hem erin dat alleen gezocht moet worden op debiteurartikelnummers van de actie debiteur (in dit geval 0123), maar ook alle records uit products, dit krijg ik niet voor elkaar, ik weet niet hoe en waar ik de join moet leggen
Ik heb onderstaande geprobeerd, maar dit werkt niet zoals het moet

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT unspsc.unspsc_omschrijving as cat, unspsc.unspsc_omschrijving_nl as oms2,
products.artikelsoort, products.id, products.artikel, products.oem, products.omschrijving_nl as prodoms,
debiteur_artikelen.debiteurartikelnummer, merken.omschrijving as merk 
FROM products Left Join debiteur_artikelen 
ON products.artikel=debiteur_artikelen.artikelnummer Inner Join merken 
ON merken.merk = products.merk Inner Join unspsc 
ON products.unspsc = unspsc.unspsc 
WHERE unspsc.unspsc>0 AND 
 ((products.omschrijving_nl LIKE '%tk%' 
OR products.omschrijving_en LIKE '%tk%' 
OR unspsc.unspsc_omschrijving LIKE '%tk%' 
OR merken.omschrijving LIKE '%tk%' 
OR products.oem LIKE '%toner%' 
OR products.artikel LIKE '%tk%' 
OR (debiteur_artikelen.debiteur='0123' AND debiteur_artikelen.debiteurartikelnummer LIKE '%tk%'))) 
ORDER BY merk,unspsc.unspsc_omschrijving,products.artikelsoort


In dit geval krijg ik toch van alle debiteuren de artikelnummers welke voldoen, ipv alleen die voor debiteur 0123.

Ik kom helaas nu niet meer verder en zit te denken aan 2x query en later de resultaten samenvoegen. Ik denk alleen dat het ook in 1 query moet kunnen, maar kan wel wat hulp gebruiken.....

Dank alvast daarvoor

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Zou je dan niet gewoon een AND ipv een OR moeten gebruiken?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Noork schreef op vrijdag 12 december 2008 @ 10:25:
Zou je dan niet gewoon een AND ipv een OR moeten gebruiken?
Als ik een AND gebruik krijg ik alleen de debiteurartikelen, niet de overige artikelen zonder relatie met debiteurartikelen.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op vrijdag 12 december 2008 @ 13:04:
[...]


Als ik een AND gebruik krijg ik alleen de debiteurartikelen, niet de overige artikelen zonder relatie met debiteurartikelen.
In de on-clause van een left-join kun je meerdere criteria opnemen (of je kan "is null" gebruiken). Daarnaast is een like-clause met een % die niet op het einde staat een uitdaging voor de db-server, die je normaal maar beter kan vermijden...

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
pedorus schreef op vrijdag 12 december 2008 @ 13:10:
[...]

In de on-clause van een left-join kun je meerdere criteria opnemen (of je kan "is null" gebruiken). Daarnaast is een like-clause met een % die niet op het einde staat een uitdaging voor de db-server, die je normaal maar beter kan vermijden...
Kun je me een voorbeeld sturen want ik heb geen idee hoe ik dit in de on-clause krijg.

Wat betreft de like met een % aan het begin... Hoe kan ik deze vermijden als ik toch op een gedeelte van een string wil zoeken wat op een willekeurige positie staat?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op vrijdag 12 december 2008 @ 13:36:
Wat betreft de like met een % aan het begin... Hoe kan ik deze vermijden als ik toch op een gedeelte van een string wil zoeken wat op een willekeurige positie staat?
Je kunt dan beter kijken naar full text search; maar of die je probleem oplost is maar de vraag. Zoeken op %iets is altijd ellende; stel je voor dat je in het telefoonboek naar iedereen moet zoeken die %eters heet. Dan zoek jij toch ook liever op piete%, niet?

Als het niet om complete lappen tekst gaat maar enkel velden met een paar woorden dan kun je een 'schaduwveld' maken met daarin de reverse van die string; dan kun je wel zoeken op srete% en kunnen er dus indices gebruikt worden. Of dat op jouw situatie van toepassing is moet je zelf bepalen. Maar ook dan ga je weer de mist in als je zoekt op %iets%.

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!

Verwijderd

Topicstarter
pedorus schreef op vrijdag 12 december 2008 @ 13:10:
[...]

In de on-clause van een left-join kun je meerdere criteria opnemen (of je kan "is null" gebruiken). Daarnaast is een like-clause met een % die niet op het einde staat een uitdaging voor de db-server, die je normaal maar beter kan vermijden...
Ik heb nu dit geprobeerd, maar dit is het nog niet, weet niet hoe dit verder aan te passen
SQL:
1
2
3
4
5
6
7
8
select products.*,debiteur_artikelen.debiteurartikelnummer
 from products left join debiteur_artikelen 
ON products.artikel=debiteur_artikelen.artikelnummer
AND (
isnull(debiteur_artikelen.debiteur) 
OR debiteur_artikelen.debiteur='051626'
)
WHERE products.artikel LIKE '%zoekcriterium%'  

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op vrijdag 12 december 2008 @ 13:41:
[...]

Je kunt dan beter kijken naar full text search; maar of die je probleem oplost is maar de vraag. Zoeken op %iets is altijd ellende; stel je voor dat je in het telefoonboek naar iedereen moet zoeken die %eters heet. Dan zoek jij toch ook liever op piete%, niet?

Als het niet om complete lappen tekst gaat maar enkel velden met een paar woorden dan kun je een 'schaduwveld' maken met daarin de reverse van die string; dan kun je wel zoeken op srete% en kunnen er dus indices gebruikt worden. Of dat op jouw situatie van toepassing is moet je zelf bepalen. Maar ook dan ga je weer de mist in als je zoekt op %iets%.
Begrijp ik het goed dat je dus beter kunt zoeken in 2 velden op printer% en retnirp% dan in 1 veld op %printer%?
Mijn doel is dat zowel printerpapier als laserprinter als sprinter als laserprinterpapier gevonden worden.

Acties:
  • 0 Henk 'm!

  • skabouter
  • Registratie: Oktober 2000
  • Laatst online: 20-08 08:55

skabouter

Skabouter

Verwijderd schreef op vrijdag 12 december 2008 @ 13:56:
[...]


Begrijp ik het goed dat je dus beter kunt zoeken in 2 velden op printer% en retnirp% dan in 1 veld op %printer%?
Mijn doel is dat zowel printerpapier als laserprinter als sprinter als laserprinterpapier gevonden worden.
Nee, laserprinterpapier ga je dan niet vinden, de overige 3 wel.
De oplossing van RobIII kent ook zo zijn beperkingen.

[ Voor 5% gewijzigd door skabouter op 12-12-2008 14:02 ]

[ Dislect ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
skabouter schreef op vrijdag 12 december 2008 @ 14:01:
De oplossing van RobIII kent ook zo zijn beperkingen.
Inderdaad; lees daarom mijn laatste zin nog maar eens. Je kunt beter kijken naar een full-text search.

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!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op vrijdag 12 december 2008 @ 13:52:
[...]

Ik heb nu dit geprobeerd, maar dit is het nog niet, weet niet hoe dit verder aan te passen
SQL:
1
2
3
4
5
6
7
8
select products.*,debiteur_artikelen.debiteurartikelnummer
 from products left join debiteur_artikelen 
ON products.artikel=debiteur_artikelen.artikelnummer
AND (
isnull(debiteur_artikelen.debiteur) 
OR debiteur_artikelen.debiteur='051626'
)
WHERE products.artikel LIKE '%zoekcriterium%'  
Dit is proberen op niks af, kijk even in de manual (incl comments) hoe een en ander werkt. Beide mogelijkheden combineren lijkt me niet zinnig (en "is null" is dus voor in de where-clause).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Naar mijn mening is de uitleg daar onoverzichtelijk en ik kan wordt dan ook niet veel wijzer daar. Maar ja.. toen ik met mijn rijlessen bezig was leek het ook ondoenlijk om zowel te sturen, schakelen, remmen en ook nog eens in de spiegels te kijken. Nu ik het rijbewijs heb lijkt het ook gemakkelijk en zie ik zelfs kans nog sms-jes te sturen tijdens het rijden...... *O*

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op vrijdag 12 december 2008 @ 15:47:
Naar mijn mening is de uitleg daar onoverzichtelijk en ik kan wordt dan ook niet veel wijzer daar.
Tsja, zo vind ik de TS wat onoverzichtelijk (inspringing, text, test 1=1) en weet ik daardoor niet wat je wilt ;)

Mijn gok is dat je "debiteur_artikelen.debiteur='0123' AND debiteur_artikelen.debiteurartikelnummer LIKE '%tk%')" naar de on-clause moet halen en dat dan is wat je wilt, maar duidelijk wordt het me eigenlijk niet... Of misschien wil je "OR debiteur_artikelen.artikelnummer IS NULL" toevoegen. Of misschien wil je de haakjes en AND/OR anders, enz....

Het lijkt me daarom het beste als je er een goede SQL-cursus bijpakt :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
pedorus schreef op vrijdag 12 december 2008 @ 22:54:
[...]

Tsja, zo vind ik de TS wat onoverzichtelijk (inspringing, text, test 1=1) en weet ik daardoor niet wat je wilt ;)

Mijn gok is dat je "debiteur_artikelen.debiteur='0123' AND debiteur_artikelen.debiteurartikelnummer LIKE '%tk%')" naar de on-clause moet halen en dat dan is wat je wilt, maar duidelijk wordt het me eigenlijk niet... Of misschien wil je "OR debiteur_artikelen.artikelnummer IS NULL" toevoegen. Of misschien wil je de haakjes en AND/OR anders, enz....

Het lijkt me daarom het beste als je er een goede SQL-cursus bijpakt :)
Het is zonder cursus (want dit soort voorbeelden heb ik niet kunnen vinden via Google) toch gelukt door van alles te proberen. Het resultaat is:

MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
       p.artikelsoort, 
    p.omschrijving_NL, 
    p.oem, 
    d.debiteurartikelnummer, 
    p.artikel
FROM 
      products  as p LEFT OUTER JOIN debiteur_artikelen  as d
     ON (p.artikel = d.artikelnummer AND d.debiteur="01234")
WHERE
      p.artikel LIKE '%tk%' OR 
     d.debiteurartikelnummer LIKE '%tk%'


Hiermee worden alle producten gevonden "like tk" en alle klantartikelnummers like tk indien deze bij debiteur 01234 horen.

Allen bedankt voor het meedenken :)
Pagina: 1