Ik gebruikte eerder een oracle database maar aangezien ik nu MySQL gebruik, moet ik de queries omzetten. In Oracle kan je bijvoorbeeld meerdere tabellen in de FROM zetten en deze dan joinen via de WHERE clause. In MySQL doe je dit echter via INNER JOIN ... ON.
Dat is niet zo moeilijk maar in Oracle kan je ook een JOIN doen op een table die op zich eigenlijk een resultset van een subquery is.
Zie voorbeeld hieronder (Oracle query):
SELECT OWNER.PURCHASEDATE AS PURCHASEDATE,
U.FIRSTNAME AS B_FIRSTNAME,
U.LASTNAME AS B_LASTNAME,
EXCHANGE.HANDINDATE AS HANDINDATE,
EXCHANGE.BORROWED AS BORROWED
FROM WIKILIB_OWNER OWNER,
(SELECT *
FROM WIKILIB_EXCHANGE EX1, WIKILIB_OWNER O1
WHERE EX1.ID =
(SELECT MAX(EX2.ID)
FROM WIKILIB_EXCHANGE EX2, WIKILIB_OWNER O
WHERE EX2.ITEMCOPY = O.ID AND O.ID = O1.ID AND EX2.BORROWED IS NOT NULL)
) EXCHANGE,
WIKILIB_USER U
WHERE EXCHANGE.ITEMCOPY(+) = OWNER.ID
AND EXCHANGE.BORROWER = U.USERNAME(+)
AND OWNER.ID = ?
DIt is de MySQL query:
SELECT OWNER.PURCHASEDATE AS PURCHASEDATE,
U.FIRSTNAME AS B_FIRSTNAME,
U.LASTNAME AS B_LASTNAME,
EXCHANGE.HANDINDATE AS HANDINDATE,
EXCHANGE.BORROWED AS BORROWED
FROM WIKILIB_OWNER OWNER
LEFT JOIN (SELECT *
FROM WIKILIB_EXCHANGE EX1, WIKILIB_OWNER O1
WHERE EX1.ID =
(SELECT MAX(EX2.ID)
FROM WIKILIB_EXCHANGE EX2, WIKILIB_OWNER O
WHERE EX2.ITEMCOPY = O.ID AND O.ID = O1.ID AND EX2.BORROWED IS NOT NULL)
) EXCHANGE ON EXCHANGE.ITEMCOPY = OWNER.ID
LEFT JOIN WIKILIB_USER U ON EXCHANGE.BORROWER = U.USERNAME
WHERE OWNER.ID = ?
Het vetgedrukte gedeelte geeft echter nog problemen in MySQL. Ik krijg de melding: "Duplicate column name 'ID' ". Ik denk dat het komt doordat je niet kan joinen op een resultset maar enkel op een volledige tabel. Als ik echter join op de tabel WIKILIB_EXCHANGE heb ik een probleem want de voorwaarde is dat ik enkel de data van de exchange met de hoogste ID krijg, waar BORROWED != NULL. Als ik die voorwaarden in een WHERE clause plaats is heel het concept om zeep want die LEFT staat er nu net omdat er voor dat item gewoon geen waarde in exchange zit... en dan returned de query helemaal niets omdat die WHERE clause niet kan checken (want geen overeenkomstige data in tabel EXCHANGE)...
Ik hoop dat de lange uitleg een beetje duidelijk is? Hoe kan ik de query herschrijven zodat hij toch doet wat ik wil?
Dat is niet zo moeilijk maar in Oracle kan je ook een JOIN doen op een table die op zich eigenlijk een resultset van een subquery is.
Zie voorbeeld hieronder (Oracle query):
SELECT OWNER.PURCHASEDATE AS PURCHASEDATE,
U.FIRSTNAME AS B_FIRSTNAME,
U.LASTNAME AS B_LASTNAME,
EXCHANGE.HANDINDATE AS HANDINDATE,
EXCHANGE.BORROWED AS BORROWED
FROM WIKILIB_OWNER OWNER,
(SELECT *
FROM WIKILIB_EXCHANGE EX1, WIKILIB_OWNER O1
WHERE EX1.ID =
(SELECT MAX(EX2.ID)
FROM WIKILIB_EXCHANGE EX2, WIKILIB_OWNER O
WHERE EX2.ITEMCOPY = O.ID AND O.ID = O1.ID AND EX2.BORROWED IS NOT NULL)
) EXCHANGE,
WIKILIB_USER U
WHERE EXCHANGE.ITEMCOPY(+) = OWNER.ID
AND EXCHANGE.BORROWER = U.USERNAME(+)
AND OWNER.ID = ?
DIt is de MySQL query:
SELECT OWNER.PURCHASEDATE AS PURCHASEDATE,
U.FIRSTNAME AS B_FIRSTNAME,
U.LASTNAME AS B_LASTNAME,
EXCHANGE.HANDINDATE AS HANDINDATE,
EXCHANGE.BORROWED AS BORROWED
FROM WIKILIB_OWNER OWNER
LEFT JOIN (SELECT *
FROM WIKILIB_EXCHANGE EX1, WIKILIB_OWNER O1
WHERE EX1.ID =
(SELECT MAX(EX2.ID)
FROM WIKILIB_EXCHANGE EX2, WIKILIB_OWNER O
WHERE EX2.ITEMCOPY = O.ID AND O.ID = O1.ID AND EX2.BORROWED IS NOT NULL)
) EXCHANGE ON EXCHANGE.ITEMCOPY = OWNER.ID
LEFT JOIN WIKILIB_USER U ON EXCHANGE.BORROWER = U.USERNAME
WHERE OWNER.ID = ?
Het vetgedrukte gedeelte geeft echter nog problemen in MySQL. Ik krijg de melding: "Duplicate column name 'ID' ". Ik denk dat het komt doordat je niet kan joinen op een resultset maar enkel op een volledige tabel. Als ik echter join op de tabel WIKILIB_EXCHANGE heb ik een probleem want de voorwaarde is dat ik enkel de data van de exchange met de hoogste ID krijg, waar BORROWED != NULL. Als ik die voorwaarden in een WHERE clause plaats is heel het concept om zeep want die LEFT staat er nu net omdat er voor dat item gewoon geen waarde in exchange zit... en dan returned de query helemaal niets omdat die WHERE clause niet kan checken (want geen overeenkomstige data in tabel EXCHANGE)...
Ik hoop dat de lange uitleg een beetje duidelijk is? Hoe kan ik de query herschrijven zodat hij toch doet wat ik wil?