Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Knivig SQL fråga

Postades av 2005-06-05 23:57:12 - Viktor ahlberg, i forum databaser, Tråden har 21 Kommentarer och lästs av 1096 personer

Har en sql fråga som jag inte får fason på.

Min tabell struktur ser ut så här:

Tabell ett
Id <- Nyckel
Namn

Tabell två
Id <- Främmande nyckel från tabell ett
Status <-nyckel
Tid

Det jag vill få fram är alla rader från tabell ett och den raden relaterade raden med det senaste tiden från tabell två

Exempel för att ytligare förtydliga

Tabell ett

1 Erik
2 Sven

Tabell två
1 1 1300
1 2 1400
2 1 1500
2 2 1300

Svaret skall således bli
1 Erik 1 2 1400
2 Sven 2 1 1500


Svara

Sv: Knivig SQL fråga

Postades av 2005-06-06 21:49:46 - Martin Rex

Jag antar att du vill ha det i en och samma fråga ?

Jag går bet på det.
Verkar inte som att man kan blanda MAX(x)-funktionen med andra fält och i synnerhet inte med "inner join"

Kan man tänka sig att använda EN tabell istället, eller finns det en massa annat som gör att strukturen måste se ut så ?

Det går ju alltid att dela upp i tre frågor och en loop...men...inte så estetiskt bra tycker jag.

/Martin


Svara

Sv:Knivig SQL fråga

Postades av 2005-06-06 22:03:04 - Björn Österman

Skrivet från huvet men den borde fungera:

Förutsätter också MS-SQL tror jag.

SELECT table1.Id, table1.Namn, table2.Tid FROM table1 INNER JOIN
(SELECT Id, Max(Tid) FROM table2) table2 ON table1.Id = table2.Id


// MvH Björne


Svara

Sv: Knivig SQL fråga

Postades av 2005-06-06 22:39:58 - Johan Djupmarker

Såhär skulle jag gjort, dock inte speciellt effektivt eftersom det blir en subselect för varje post (otestat...):

SELECT tabell1.Id, tabell1.Namn, tabell2.Id, tabell2.Status, tabell2.Tid FROM tabell1 INNER JOIN tabell2 ON tabell1.Id = tabell2.Id WHERE tabell2.Status = (SELECT TOP 1 Status FROM tabell2 WHERE Id = tabell1.Id ORDER BY Tid DESC)

En effektivare modell om det inte finns flera poster med samma tid (för samma person) borde vara såhär (även detta otestat):

SELECT tabell1.Id, tabell1.Namn, tabell2.Id, tabell2.Status, tabell2.Tid FROM (tabell1 INNER JOIN tabell2 ON tabell1.Id = tabell2.Id) INNER JOIN (SELECT Id, MAX(Tid) FROM tabell2 GROUP BY Id) X ON tabell2.Tid = X.Tid AND tabell2.Id = X.Id

Borde fungera i Access och SQL-Server, hur det är med andra databaser vet jag inte.

/Johan


Svara

Sv:Knivig SQL fråga

Postades av 2005-06-06 23:03:30 - Björn Österman

Förrutom några syntax fel förstår jag inte vad som var fel med min select?

EDIT: Oops, missade fältet status, då får jag instämma med förra talare. ;-P

Uppdaterad:

SELECT table1.Id, table1.Namn, table2.Tid FROM table1 INNER JOIN
(SELECT Id, Max(Tid) as tid FROM table2 GROUP BY Id) table2 ON table1.Id = table2.Id


// MvH Björne


Svara

Sv:Knivig SQL fråga

Postades av 2005-06-06 23:10:55 - Viktor ahlberg

Tänkte också som du johan men får inte frågan att fungera använder mig av MySQL är det något specielt man ska tänka på då när det gäller nästlade frågor


Svara

Sv: Knivig SQL fråga

Postades av 2005-06-06 23:24:13 - Martin Rex

jaja, jag fick ju igång killarna i alla fall....eller hur ? :-)


Svara

Sv: Knivig SQL fråga

Postades av 2005-06-06 23:30:42 - Michael Beckius

SELECT MAX(b.tid), b.status, b.id AS id2, a.namn, a.id FROM `tabell1` a INNER JOIN `tabell2` b ON b.id = a.id GROUP BY a.namn


Svara

Sv:Knivig SQL fråga

Postades av 2005-06-07 00:22:48 - Björn Österman

Michael: Tyvärr så ger det inte riktigt den effekt som Victor eftersträvar, jag gjorde liknande misstag lite högre upp.

För att rädda min egen heder så testade jag att ladda ner mySQL och testa själv. (Fick jag en ursäkt för att göra det också)

mySQL verkar inte har någon TOP-parameter, men de har en LIMIT-parameter, så om man tar Johans SELECT-sats och modifierar den lite.

SELECT tabell1.Id, tabell1.Namn, tabell2.Id, tabell2.Status, tabell2.Tid FROM tabell1 
           INNER JOIN tabell2 ON tabell1.Id = tabell2.Id 
           WHERE tabell2.Status = 
                     (SELECT Status FROM tabell2 WHERE Id = tabell1.Id ORDER BY Tid DESC LIMIT 1) 


Så verkar det bli rätt.

// MvH Björne


Svara

Sv: Knivig SQL fråga

Postades av 2005-06-07 10:32:49 - Viktor ahlberg

Jag är tacksam för er hjälp men får följande felmedelande när jag jör björns sats

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT Status FROM tabell2 WHERE id = tabell1.

fattar inte vad det kan vara i mssql är det ju inga problem med den här typen av frågor


Svara

Sv:Knivig SQL fråga

Postades av 2005-06-07 10:50:38 - Björn Österman

Så här ser det ut för mig ifall jag kopierar rakt av:

mysql> select @@version;
+------------+
| @@VERSION  |
+------------+
| 4.1.12a-nt |
+------------+
1 row in set (0.02 sec)

mysql> select * from tabell1;
+------+------+
| id   | Namn |
+------+------+
|    1 | Erik |
|    2 | Sven |
+------+------+
2 rows in set (0.00 sec)

mysql> select * from tabell2;
+------+--------+------+
| id   | status | tid  |
+------+--------+------+
|    1 |      1 | 1300 |
|    1 |      2 | 1400 |
|    2 |      1 | 1500 |
|    2 |      2 | 1300 |
+------+--------+------+
4 rows in set (0.00 sec)

mysql> SELECT tabell1.Id, tabell1.Namn, tabell2.Id, tabell2.Status, tabell2.Tid FROM tabell1
    ->            INNER JOIN tabell2 ON tabell1.Id = tabell2.Id
    ->            WHERE tabell2.Status =
    ->         (SELECT Status FROM tabell2 WHERE Id = tabell1.Id ORDER BY Tid DESC LIMIT 1)
    -> ;
+------+------+------+--------+------+
| Id   | Namn | Id   | Status | Tid  |
+------+------+------+--------+------+
|    1 | Erik |    1 |      2 | 1400 |
|    2 | Sven |    2 |      1 | 1500 |
+------+------+------+--------+------+
2 rows in set (0.00 sec)


// MvH Björne


Svara

Sv: Knivig SQL fråga

Postades av 2005-06-07 12:16:58 - Viktor ahlberg

Japp nu ser jag vad som kan vara fel Jag får följande version nummer

'4.0.24-standard'

kan det vara det som är fel att den inte klarar nästlade frågor


Svara

Sv:Knivig SQL fråga

Postades av 2005-06-07 13:07:26 - Per Persson

Japp, MySQL klarar inte nästlade frågor förrän fr.o.m. version 4.1.


Svara

Sv:Knivig SQL fråga

Postades av 2005-06-07 13:12:24 - Björn Österman

Hittade följande på http://www.mysql.com/products/mysql/

Expanded support for subqueries
Subqueries allow you to use the result of one query as a component of a larger query. The MySQL server already supports some forms of this technique, such as INSERT INTO ... SELECT ..., and this support will be expanded in version 4.1 to include nested SELECT queries, which is one of the most-requested features from our users

// MvH Björne


Svara

Sv: Knivig SQL fråga

Postades av 2005-06-07 15:26:46 - Viktor ahlberg

Tack ni har hjälpt mig mycket kunde inte för mitt liv begripa vad jag gjorde för fel ens när jag skrev den enklaste nästlade frågan.

Mitt webb hotell använder sig av den äldre versionen så det blir till att gå över till ms sql, dessa har vad jag vet inte detta problem oavsett version?


Svara

Sv:Knivig SQL fråga

Postades av 2005-06-07 17:14:13 - Johan Djupmarker

Nej, i MSSQL fungerar det bra. Känns lite overkill att byta enbart för detta? Det går ju lösa med temporära tabeller eller kod i applikationen...

/Johan


Svara

Sv: Knivig SQL fråga

Postades av 2005-06-07 22:40:09 - Michael Beckius

Vad är det som inte blir rätt?

Jag la in båda tabellerna i min mysql-databas exakt som han beskrev dom med samma värden och körde denna sql-frågan och fick rätt svar.


Svara

Sv:Knivig SQL fråga

Postades av 2005-06-07 22:58:58 - Björn Österman

Victor kör MySQL 4.0 och det fungerar inte förrens version 4.1

// MvH Björne


Svara

Sv: Knivig SQL fråga

Postades av 2005-06-08 07:19:43 - Viktor ahlberg

Kan också hålla med om att det är lite over kill, men jag precis startat upp det här projektet så det blir inte mycket mer jobb än att skapa dessa nya tabeller och om det har börjat att krångla på en så enkel sak så känns det skönare att gå över till MS SQL


Svara

Sv: Knivig SQL fråga

Postades av 2005-06-08 20:30:19 - Michael Beckius

Vilket är det som inte funkar? Jag gör ju endast en enkel inner join på två tabeller. Det, samt max och group by måste väl ändå fungera i mysql 4.0?


Svara

Sv:Knivig SQL fråga

Postades av 2005-06-08 21:19:00 - Björn Österman

Michael: Din query genererar följande resultat:
<code>
+------------+--------+------+------+------+
| MAX(b.tid) | status | id2 | namn | id |
+------------+--------+------+------+------+
| 1400 | 1 | 1 | Erik | 1 |
| 1500 | 1 | 2 | Sven | 2 |
+------------+--------+------+------+------+
</code>
Det Victor vill få ut är följande: (notera status-kolumnen)
<code>
+------------+--------+------+------+------+
| MAX(b.tid) | status | id2 | namn | id |
+------------+--------+------+------+------+
| 1400 | 2 | 1 | Erik | 1 |
| 1500 | 1 | 2 | Sven | 2 |
+------------+--------+------+------+------+
</code>

// MvH Björne


Svara

Nyligen

  • 15:35 Chicken road crash game
  • 21:41 Automotive Services UK
  • 20:44 Erfarenhet av CBD-olja mot sömnpro
  • 12:13 Sex Dolls for Sale
  • 19:42 Online Casinos for Haitian Players
  • 19:38 Rekommendera något intressant
  • 19:13 Международная перевозка грузов
  • 00:01 DL Van Tuning | Exclusive Body Kit

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 888
27 965
271 777
6 841
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies