WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Skriva om subquery till join (https://www.wn.se/forum/showthread.php?t=23165)

grazzy 2007-08-27 02:07

Nån som kan skriva om följande sql-kod till en ordentlig joinad?
Kod:

select cref_host from hit where site=75 and date > \'2007-08-26\' and cref_host not in (select cref_host from hit where site = 75 and date < \'2007-08-26\' group by cref_host) group by cref_host
Den här frågan ger precis tvärtom det jag vill ha:
Kod:

select a.date,a.cref_host,b.cref_host from hit a, hit b where a.site = 75 and a.date >= \'2007-08-26\' and b.site = 75 and b.date < \'2007-08-26\' and b.cref_host = a.cref_host group by a.cref_host order by a.date desc
Enligt mysql-dokumentationen borde jag kunna utnyttja att b.cref_host skall bli null, dvs
Kod:

select a.date,a.cref_host,b.cref_host from hit a, hit b where a.site = 75 and a.date >= \'2007-08-26\' and b.site = 75 and b.date < \'2007-08-26\' and b.cref_host = a.cref_host and b.cref_host is null group by a.cref_host order by a.date desc
Men det funkar inte heller, blir inga resultat alls. Nån som har nån clue?

Det jag vill uppnå är alltså att plocka fram alla rader som har skapats sedan 2007-08-26 men inte finns tidigare i databasen. Nya rader dvs.

jimmie 2007-08-27 02:59

Du gör en inner join ovan, med vilkoret b.cref_host = a.cref_host sorterar du bort alla icke-träffar och då blir det en tom lista.

Kod:

SELECT
  a.date,
  a.cref_host,
  b.cref_host
FROM hit As a
LEFT JOIN hit As b ON
  b.site = 75
  AND b.date < '2007-08-26'
  AND b.cref_host = a.cref_host
WHERE
  a.site = 75
  AND a.date >= '2007-08-26'
  AND b.cref_host is null
GROUP BY a.cref_host
ORDER BY a.date desc

Klockan är mycket och jag har inte testat queryn på något sätt men det du vill göra är först en left outer join (innehåller även poster som inte hittade någon träff i tabellen den joinas med) och sedan kolla is null.

grazzy 2007-08-27 03:37

Hehe, jag börjar också bli lite trött. Satt och testade med fråganmot fel databas i 10 minuter här.

Det där funkar kalas, jag verkar ha missat att SQL defaultar till inner join och inte left join och missat helt skillnaden mellan att ha vilkoren under ON () och den globala WHERE-biten.

Super, tack :P


Alla tider är GMT +2. Klockan är nu 00:45.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson