[MySQL]Hulp nodig bij maken query....

Pagina: 1
Acties:

  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
Okee mensen, ik ben aan het knutselen aan de volgende query :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1.  INSERT INTO pot_roi_inout SELECT
2.      'NULL', 
3.      pot_visitors.referer_id, 
4.      pot_accesslog.document_id, 
5.      count(pot_accesslog.document_id), 
6.      IF((pot_visitors.referer_id   IN ('SELECT pot_roi_paidhosts.referer_id   FROM pot_roi_paidhosts')),   pot_roi_paidhosts.PayingAmount,     0), 
7.      IF((pot_accesslog.document_id IN ('SELECT pot_roi_pageincome.document_id FROM pot_roi_pageincome')),  pot_roi_pageincome.IncomePerVisit,  0), 
8.      IF((pot_visitors.referer_id   IN ('SELECT pot_roi_paidhosts.referer_id   FROM pot_roi_paidhosts')),   pot_roi_paidhosts.PayPerClick,      1),
9.      IF((pot_visitors.referer_id   IN ('SELECT pot_roi_paidhosts.referer_id   FROM pot_roi_paidhosts')),   pot_roi_paidhosts.DaysPerPayPeriod, 1)
10. FROM
11.     pot_visitors,
12.     pot_accesslog,
13.     pot_roi_paidhosts,
14.     pot_roi_pageincome
15. WHERE
16.     pot_visitors.accesslog_id = pot_accesslog.accesslog_id 
17. AND
18.     pot_accesslog.timestamp > ". $TimePeriodStart ."
19. AND
20.     pot_accesslog.timestamp < ". $TimePeriodEnd ."
21. AND
22.     IF((pot_visitors.referer_id   IN ('SELECT pot_roi_paidhosts.referer_id   FROM pot_roi_paidhosts')), pot_visitors.referer_id = pot_roi_paidhosts.referer_id, 1 = 1)
23. AND
24.     IF((pot_accesslog.document_id IN ('SELECT pot_roi_pageincome.document_id FROM pot_roi_pageincome')), pot_accesslog.document_id = pot_roi_pageincome.document_id, 1 = 1)
25. GROUP BY
26.     pot_visitors.referer_id,
27.     pot_accesslog.document_id

Hierbij heb ik het volgende probleem : In de SELECT query velden word met een IF statement aangegeven dat óf, zoals bijvoorbeeld in regel 6, pot_roi_paidhosts.PayingAmount moet worden weergegeven, óf er word 0 weergegeven.

Nou moet ik natuurlijk van pot_roi_paidhosts.PayingAmount (regel 6) maar één rij hebben, en niet allemaal. Daarom moet daar dus een WHERE op toegepast worden.

Maar die WHERE mag dus ook alleen toegepast worden ALS het bovenstaande IF-statement true, oftewel pot_roi_paidhosts.PayingAmount geeft!

Nou kan ik een IF-statement ook binnen een WHERE statement plaatsen, maar dan krijg je niet uiteindelijk 'WHERE pot_visitors.referer_id = pot_roi_paidhosts.referer_id' (regel 22), maar 'WHERE 1' of 'WHERE 0', aangezien 'pot_visitors.referer_id = pot_roi_paidhosts.referer_id' word ge-parsed tot een boolean. Oftewel, als er FALSE (= 0) uitkomt, dan levert mijn query in het geheel geen resultaat op. En da's niet de bedoeling! Wie weet hoe dit op te lossen?

Bedankt! _/-\o_

Genoeg is meer dan veel, en tart den overvloed


  • whoami
  • Registratie: December 2000
  • Nu online
* whoami vind het vreemd dat het toegestaan is om IF-statements ed in een SQL statement te zetten. (of is dat een MySQL functie :?)

Ik denk dat je uw query dynamisch zult moeten gaan opbouwen, want je weet niet op voorhand of die where nu eigenlijk mag uitgevoerd worden, dus de structuur van je query is op voorhand nog niet bekend.

https://fgheysels.github.io/


Verwijderd

Je kan je IF statement ook gewoon aanspreken ( doe uiteraard wel ff een 'AS blaat' ), dan moet jou probleem toch wel op te lossen zijn?

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 02-01 05:18

KompjoeFriek

Statsidioot

Ik mag zeker wel gebruikt worden in een SQL-Query,
alleen is dit geen
If ... Then ... Else ...
Maar
If ... In ...
:D

WhatPulse! - Rosetta@Home - Docking@Home


Verwijderd

whoami schreef op 25 november 2002 @ 15:00:
* whoami vind het vreemd dat het toegestaan is om IF-statements ed in een SQL statement te zetten. (of is dat een MySQL functie :?)

Ik denk dat je uw query dynamisch zult moeten gaan opbouwen, want je weet niet op voorhand of die where nu eigenlijk mag uitgevoerd worden, dus de structuur van je query is op voorhand nog niet bekend.
Bijna alle databasepakketten ondersteunen if-statement (het heet regelmatig anders, maar dat doet er niet toe).
En dat is ook heel logisch, want je query kan dan wel dynamisch opgebouwt worden, maar je heb altijd standaard beperkingen aan je tabel hangen, en vooral als die een beetje gecompliceerd zijn kan je die heel mooi verwerken met if-statements, dat scheelt weer een brok code.

Verwijderd

Windoos-vernieler schreef op 25 november 2002 @ 15:06:
Ik mag zeker wel gebruikt worden in een SQL-Query,
alleen is dit geen
If ... Then ... Else ...
Maar
If ... In ...
:D
Het is wel if.. then.. else.., maar met een andere manier van schrijven (syntax)

[ Voor 14% gewijzigd door Verwijderd op 25-11-2002 15:08 ]


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
En die lading subselects in je if's gaat echt werken in MySQL? :)

  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
Windoos-vernieler schreef op 25 november 2002 @ 15:06:
Ik mag zeker wel gebruikt worden in een SQL-Query,
alleen is dit geen
If ... Then ... Else ...
Maar
If ... In ...
:D
Ff voor de duidelijkheid mensen, we hebben het hier over pure MySQL code, en MySQL ondersteunt IF-statements in de vorm van
IF (voorwaarde, wat-te-returnen-indien-true, wat-te-returnen-indien-false)

Genoeg is meer dan veel, en tart den overvloed


  • smaij
  • Registratie: November 2000
  • Laatst online: 18:35
code:
1
2
3
SELECT blablabla IN (SELECT bladiebladie FROM tabelletje)
FROM bladiebladieblatabel
WHERE


MAG NOG STEEDS NIET :+ .. en ik denk dat jouw MySQL ook nog geen subqueries ondersteund dus dan gaat dat verhaal van jou ook niet op.. je zal het inderdaad anders moeten doen en dus hier een php scrippie voor moeten schrijven..
Alhoewel als je op mijn naam zoekt ook nog wel een topicje tegen komt over IF THEN gebruik in MySQL met Left Joins en dat moet volgens mij te doen zijn in dit verhaal

edit:
en ik moet sneller typen :(

[ Voor 5% gewijzigd door smaij op 25-11-2002 15:12 ]


  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
Smaij, waar zie jij ergens "SELECT blablabla IN (SELECT bladiebladie FROM tabelletje)" constructies staan in mijn query? Volgens mij lees je niet zo goed...

[ Voor 8% gewijzigd door NaliXL op 25-11-2002 15:15 ]

Genoeg is meer dan veel, en tart den overvloed


  • whoami
  • Registratie: December 2000
  • Nu online
NaliXL schreef op 25 november 2002 @ 15:11:
[...]

Ff voor de duidelijkheid mensen, we hebben het hier over pure MySQL code, en MySQL ondersteunt IF-statements in de vorm van
IF (voorwaarde, wat-te-returnen-indien-true, wat-te-returnen-indien-false)


Dan hebben we het dus over een if-functie en niet over een if-statement. Dan ben ik mee. ;)

https://fgheysels.github.io/


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
NaliXL schreef op 25 november 2002 @ 15:15:
Smaij, waar zie jij ergens "SELECT blablabla IN (SELECT bladiebladie FROM tabelletje)" constructies staan in mijn query? Volgens mij lees je niet zo goed...
code:
1
IF((pot_visitors.referer_id   IN ('SELECT pot_roi_paidhosts.referer_id   FROM pot_roi_paidhosts')),   pot_roi_paidhosts.PayingAmount,     0)

Een select binnen een insert statement (maar gequote als string?) maakt een subquery imho

Verwijderd

NaliXL: Gaat draaien van die query op zich wel goed??

  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
Oh, sorry mensen, ik zie dat sub-selects idd. alleen nog ge-support worden in de CVS-versie. Gek genoeg word er geen foutmelding gegeven? Nou ja, in ieder geval ga ik ff verder zoeken naar alternatieven...

Genoeg is meer dan veel, en tart den overvloed


Verwijderd

NaliXL schreef op 25 november 2002 @ 15:36:
Oh, sorry mensen, ik zie dat sub-selects idd. alleen nog ge-support worden in de CVS-versie. Gek genoeg word er geen foutmelding gegeven? Nou ja, in ieder geval ga ik ff verder zoeken naar alternatieven...
Dat is niet raar want je geeft een string mee.
Die ziet mysql dus ook niet als een subselect.

Je kan die subselect ook alvast van te voren doen, zodat je die alvast invult.

  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
Verwijderd schreef op 25 November 2002 @ 15:39:
[...]

Dat is niet raar want je geeft een string mee.
Die ziet mysql dus ook niet als een subselect.

Je kan die subselect ook alvast van te voren doen, zodat je die alvast invult.
Ahá, en ik maar denken van "ik zal die sub-select wel als string moeten geven ofzo".... Hoe een mens zich al niet kan vergissen :P |:(

Bedankt allemaal!

Genoeg is meer dan veel, en tart den overvloed


  • smaij
  • Registratie: November 2000
  • Laatst online: 18:35
NaliXL schreef op 25 november 2002 @ 15:15:
Smaij, waar zie jij ergens "SELECT blablabla IN (SELECT bladiebladie FROM tabelletje)" constructies staan in mijn query? Volgens mij lees je niet zo goed...
Ik lees wel goed.. vergat de IF nougoed?
Jij leest ook niet echt goed blijkbaar....

  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 04-08 13:06

GraasGast

Analogue Heaven

als je het perse zo wil doen, denk dan eens aan PostGreSQL, die kan wel subquery's :)

  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

Is het niet met LEFT JOIN's op te lossen?

code:
1
2
3
4
5
6
7
8
9
INSERT INTO pot_roi_inout
SELECT 'NULL', pot_visitors.referer_id, pot_accesslog.document_id, count(pot_accesslog.document_id), pot_roi_paidhosts.PayingAmount, pot_roi_pageincome.IncomePerVisit, pot_roi_paidhosts.PayPerClick, pot_roi_paidhosts.DaysPerPayPeriod
FROM pot_visitors,
INNER JOIN pot_accesslog ON pot_visitors.acceslog_id = pot_accesslog.accesslog_id
LEFT JOIN pot_roi_paidhosts ON pot_visitors.referer_id = pot_roi_paidhosts.referer_id
LEFT JOIN   pot_roi_pageincome ON pot_accesslog.document_id = pot_roi_pageincome.document_id
WHERE pot_accesslog.timestamp > ". $TimePeriodStart ."
AND pot_accesslog.timestamp < ". $TimePeriodEnd ."
GROUP BY pot_visitors.referer_id, pot_accesslog.document_id

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

robjanssen schreef op 25 november 2002 @ 19:22:
Is het niet met LEFT JOIN's op te lossen?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
INSERT INTO pot_roi_inout
SELECT 'NULL'
      ,pot_visitors.referer_id
      ,pot_accesslog.document_id
      ,count(pot_accesslog.document_id)
      ,pot_roi_paidhosts.PayingAmount
      ,pot_roi_pageincome.IncomePerVisit
      ,pot_roi_paidhosts.PayPerClick
      ,pot_roi_paidhosts.DaysPerPayPeriod
FROM   pot_visitors,
       INNER JOIN pot_accesslog ON pot_visitors.acceslog_id = pot_accesslog.accesslog_id
       LEFT JOIN pot_roi_paidhosts ON pot_visitors.referer_id = pot_roi_paidhosts.referer_id
       LEFT JOIN pot_roi_pageincome ON pot_accesslog.document_id = pot_roi_pageincome.document_id
WHERE  pot_accesslog.timestamp > ". $TimePeriodStart ."
AND    pot_accesslog.timestamp < ". $TimePeriodEnd ."
GROUP BY pot_visitors.referer_id
        ,pot_accesslog.document_id
Precies, want er zijn hier wel een hoop reacties op zijn vraag wat er mis gaat met de query, maar reverse-engineering op het statement geeft mij de indruk dat het gewoon een outerjoin is die gevraagd wordt op de twee tabellen die nu in de SELECT (IF...'s staan.
Die IF's moeten volgens mij nog wel ingebouwd worden in bovenstaan statement om de 0 en 1 in te voeren als de ID niet bestaat in de sub-tabellen. Met een IFNULL oid.

[ Voor 3% gewijzigd door Goodielover op 26-11-2002 11:05 . Reden: taalfoutje ]


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Goodielover schreef op 26 November 2002 @ 11:04:
Precies, want er zijn hier wel een hoop reacties op zijn vraag wat er mis gaat met de query, maar reverse-engineering op het statement geeft mij de indruk dat het gewoon een outerjoin is die gevraagd wordt op de twee tabellen die nu in de SELECT (IF...'s staan.
Die IF's moeten volgens mij nog wel ingebouwd worden in bovenstaan statement om de 0 en 1 in te voeren als de ID niet bestaat in de sub-tabellen. Met een IFNULL oid.
Daar heb je inderdaad gelijk in, maar blijft nog steeds overeid dat er een subquery in de query zit en het blijft MySQL:)

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Er zit helemaal geen sub-query in, waar haal jij die vandaan?!

robjanssen heeft er helemaal geen subquery in gedaan. Een het is precies de functionaliteit die bedoeld is.

[ Voor 51% gewijzigd door Goodielover op 26-11-2002 13:54 ]


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Goodielover schreef op 26 november 2002 @ 13:51:
Er zit helemaal geen sub-query in, waar haal jij die vandaan?!

robjanssen heeft er helemaal geen subquery in gedaan. Een het is precies de functionaliteit die bedoeld is.
robjanssen schreef op 25 november 2002 @ 19:22:
code:
1
2
INSERT INTO pot_roi_inout
SELECT 'NULL', pot_visitors.referer_id, pot_accesslog.document_id, count(...)
Een select in een insert was toch nog steeds een subquery naar mijn idee :)

  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
OKEE OKEE mensen, ik was zelf niet helemaal 100% helder toen ik mijn reactie op Smaij gaf. Hoop dat dat overkomenlijk is ;) . Robjanssen : Bedankt voor je code. Ik vind die joins altijd verschrikkelijk ingewikkeld, maar ik zal het ff uitproberen. Bedankt!

Verder : Is er juist niet een soortement van "WhereIfExists"? Dus zoiets als :
code:
1
2
3
4
5
6
7
8
Select 
     Autos.Motor, 
     Boten.Motor 
FROM 
     Autos, 
     Boten 
WHEREIFEXISTS 
     Autos.Motor = Boten.Motor

En dat dat dan zoiets zou geven als
code:
1
2
3
4
5
6
7
+----------------------------------------+
|Autos.Motor        |   Boten.Motor      |
+-------------------+--------------------+
| Ferrari           | Ferrari            |
| Porche            | Porche             |
| Honda             | NULL               |
+-------------------+--------------------+

Dus, dat er ge-matched word als er een match gemaakt kan worden, en anders word NULL gegeven. Dat zou dus ook doen wat ik zocht.

Genoeg is meer dan veel, en tart den overvloed


  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
Glimi schreef op 26 november 2002 @ 14:18:
[...]


[...]

Een select in een insert was toch nog steeds een subquery naar mijn idee :)
Hmm, mogelijk, maar dit werkt wél in MySQL! Ik heb het nl. diverse keren gebruikt...

Genoeg is meer dan veel, en tart den overvloed


Verwijderd

NaliXL schreef op 26 November 2002 @ 15:54:
code:
1
2
3
4
5
6
7
8
Select 
     Autos.Motor, 
     Boten.Motor 
FROM 
     Autos, 
     Boten 
WHEREIFEXISTS 
     Autos.Motor = Boten.Motor
hmm, een SELECT * FROM autos AS a LEFT JOIN boten AS b ON a.motor = b.motor

??

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Precies dus wat robjanssen zei!
Dit wordt een topic van herhalingen

  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
Mensen, bedankt voor de hulp tot nu toe. Ik ben hard bezig geweest met de query van robjanssen, maar ik krijg die niet aan de praat. Moet even voorop stellen dat ik tot nu toe nooit met joins heb gewerkt :

Goed, de query van robjanssen werkt niet direct. Nou bleek het grotendeels een simpel op te lossen syntax-fout te zijn, zodat ik de volgende query krijg :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
INSERT INTO pot_roi_inout
SELECT 
    'NULL',
    pot_visitors.referer_id,
    pot_accesslog.document_id,
    count(pot_accesslog.document_id),
    pot_roi_paidhosts.PayingAmount,
    pot_roi_pageincome.IncomePerVisit,
    pot_roi_paidhosts.PayPerClick,
    pot_roi_paidhosts.DaysPerPayPeriod
FROM   
    pot_visitors,
    pot_visitors  INNER JOIN pot_accesslog      ON pot_visitors.acceslog_id  = pot_accesslog.accesslog_id
        pot_visitors  LEFT  JOIN pot_roi_paidhosts  ON pot_visitors.referer_id   = pot_roi_paidhosts.referer_id
        pot_accesslog LEFT  JOIN pot_roi_pageincome ON pot_accesslog.document_id = pot_roi_pageincome.document_id
WHERE  
    pot_accesslog.timestamp > 0
AND    
    pot_accesslog.timestamp < 1038394682
GROUP BY 
    pot_visitors.referer_id,
    pot_accesslog.document_id

Okee, nu geen syntax errors meer. Maar nu krijg ik bij het uitvoeren de error "ERROR 1066: Not unique table/alias: 'pot_visitors". Dat snap ik nou eigenlijk niet helemaal. Ik heb geen aliassen gebruikt, en bij mijn weten kun je niet eens 2 tabellen maken met dezelfde naam in een MySQL database, laat staan dat ik die situatie heb. Nou ben ik op zoek geweest online, en tussen de enorme afwezigheid van informatie over deze error heb ik een stukje text weten te vinden wat mij heel vaag uitlegde dat het weleens kon gaan om het matchen met een niet-unieke key. Nou is referer_id inderdaad niet uniek. Dus haal ik bij wijze van test de regel
code:
1
pot_visitors  LEFT  JOIN pot_roi_paidhosts  ON pot_visitors.referer_id   = pot_roi_paidhosts.referer_id

eens weg. Maar helaas, de fout blijft bestaan. Wie helpt mij hiermee :?
Plees doont bijt! :/ ;)

PS : die timestamp is idd. anders dan in de originele vraag. Was toen vergeten wat PHP-code te vervangen...

Genoeg is meer dan veel, en tart den overvloed


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 16:43

Dido

heforshe

Je hebt 3 keer pot_visitors in je select staan, dat kan natuurlijk niet...

Het idee is FROM tabel1 JOIN tabel2 ON bla1=bla2

Jij zegt nu dat je wilt selecteren uit tabel1, en uit tabel1 gejoind met tabel twee, en tabel1 gejoined met tabel3. Dus drie keer uit tabel1!

Kijk nog eens heel goed naar de voorbeeldcode :)

Wat betekent mijn avatar?


  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
Okee, heel hartelijk bedankt! Het werkt nu OK!

Genoeg is meer dan veel, en tart den overvloed

Pagina: 1