[php/mysql] query probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb deze query voor het maken van een result-tabel;

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$q = "
        SELECT
                t1.id,
                t1.tek_id,
                t1.datum,
                tek.tek_nr,
                t1.verkoopPrijs
        FROM
                tek_archief AS t1
        LEFT JOIN
                tekeningen AS tek
        ON
                (t1.tek_id = tek.tek_id)
        ORDER BY
                t1.tek_id ASC, t1.datum DESC
    ";


Echter, het kan gebeuren dat er in `tek_archief` meerdere rijen staan met als gelijke het veld t1.tek_id. De datum zal dan altijd verschillen.
Nu wil ik uit `tek_archief` alle unieke tek_id's hebben, en dan de meeste recente.

Ik ken de functie DISTINCT uiteraard; maar ik snap niet hoe ik die toe zou moeten passen. Ik heb al meerdere plaatsen geprobeerd in de query, maar het werkt niet op de e.o.a. manier. Kan iemand mij hierbij helpen? Zou fijn zijn; ik begrijp tevens dat het niet heel moelijk kan zijn maar de MySQL online documentatie laat het even afweten voor mij op het moment.

[ Voor 5% gewijzigd door Verwijderd op 25-08-2004 14:47 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:45
MIN()
GROUP BY

Distinct wordt trouwens toegepast op de volledige row.

[ Voor 66% gewijzigd door whoami op 25-08-2004 14:49 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Werkt het niet met DISTINCT t1.tek_id? Ik vraag me dan alleen af of degene met de nieuwste datum dan wel gekozen wordt. Mischien gedraagt MySQL zich zo dat het sorteren pas gebeurt als deze actie al is uitgevoerd.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • _Sunnyboy_
  • Registratie: Januari 2003
  • Laatst online: 19-09 14:58

_Sunnyboy_

Mooooooooooooooooo!

Met subqueries zou dit wel lukken, maar ik neem aan dat je nog met MySQL 3.x zit?

MIN() danwel MAX() en GROUP BY kan misschien ook wel, maar hoe zit het dan met de andere waarden in tek_archief. Als bijv de verkoopPrijs ook varieert loop je vast.

Dan moet je denk ik subqueries gebruiken, en als dat niet kan moet je eerst een query draaien om voor elke tek_archief.id de max(datum) te halen en vervolgens voor elk result nog een query :'(

[ Voor 55% gewijzigd door _Sunnyboy_ op 25-08-2004 15:18 ]

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ben al iets verder;

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        SELECT
                t1.id,
                t1.tek_id,
                t1.datum,
                tek.tek_nr,
                t1.verkoopPrijs
        FROM
                pm_tek_archief AS t1
        LEFT JOIN
                pm_tekeningen AS tek
        ON
                (t1.tek_id = tek.tek_id)
        GROUP BY
                t1.tek_id


Dit laat alle unieke tek_id rows zien, maar let daarbij niet op de hoogte van `datum`. Als ik De query zo aanpas:

PHP:
1
2
3
4
5
6
7
        SELECT
                t1.id,
                t1.tek_id,
                MAX(t1.datum),
                tek.tek_nr,
                t1.verkoopPrijs
//...etc.


.. dan selecteerd hij de hoogste datum maar mixt hij de waardes (columns) van de verschillende rijen door elkaar.Met andere woorden, hij pakt de eerste rij van een tek_id, en pakt vervolgens alleen het datum-field die het hoogste is (uit een andere rij!) (in vergelijking met alle rijen die datzelfde tek_id hebben).

Acties:
  • 0 Henk 'm!

  • _Sunnyboy_
  • Registratie: Januari 2003
  • Laatst online: 19-09 14:58

_Sunnyboy_

Mooooooooooooooooo!

Ja dat probleem bedacht ik net, daarom heb ik m'n post ge-edit. Zonder sub-queries kan wat jij wil niet in 1 query denk ik :'(

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:45
Je moet toch echt eens goed lezen wat group by doet. Daarbij vind ik het ook vreemd dat je in je eerste query een group by specifieert zonder aggregate functie.
(Rare implementatie in mysql...).

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • _Sunnyboy_
  • Registratie: Januari 2003
  • Laatst online: 19-09 14:58

_Sunnyboy_

Mooooooooooooooooo!

Ik bedenk net wat. Je kan met een query alle tek_archief.id ophalen die je nodig hebt, met GROUP BY tek_id en datum=MAX(datum).

Vervolgens kan je met een 2e query alle data ophalen voor alleen deze id's met behulp van IN()

select bla from table left join table on () WHERE tl.id IN (imploded array of id's)

[ Voor 4% gewijzigd door _Sunnyboy_ op 25-08-2004 15:27 ]

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
_Sunnyboy_ schreef op 25 augustus 2004 @ 15:23:
Ik bedenk net wat. Je kan met een query alle tek_archief.id ophalen die je nodig hebt, met GROUP BY tek_id en datum=MAX(datum).

Vervolgens kan je met een 2e query alle data ophalen voor alleen deze id's met behulp van IN()

select bla from table left join table on () WHERE tl.id IN (imploded array of id's)
Klopt helaas niet volgens mij, want je kan niet het archief.id opvragen die bij de hoogte archief.datum hoort. Wel het archief.tekening_id, maar niet het archief.id.

Dat is eigenlijk het hele probleem.
Eigenlijk is de query die ik zoek:

Pseudo:
code:
1
2
3
4
5
6
7
SELECT
        archief.id, // uit de rij van de geselecteerde datum
        tek_id,     // DISTINCT, eenmalig
        datum,      // Hoogste van alle rijen die dezelfde tek_id hebben
        prijs,      // uit de rij van de geselecteerde datum
FROM
        archief

[ Voor 30% gewijzigd door Verwijderd op 25-08-2004 15:51 ]


Acties:
  • 0 Henk 'm!

  • _Sunnyboy_
  • Registratie: Januari 2003
  • Laatst online: 19-09 14:58

_Sunnyboy_

Mooooooooooooooooo!

Je hebt gelijk wat ik wilde kan niet in MySQL

Om te doen wat jij wil heb je dan een subquery nodig, en dat kan pas vanaf MySQL 4.1

code:
1
2
3
4
5
6
7
8
SELECT
        a.archief.id,    // uit de rij van de geselecteerde datum
        a.tek_id,        // DISTINCT, eenmalig
        a.datum,        // Hoogste van alle rijen die dezelfde tek_id hebben
        a.prijs,        // uit de rij van de geselecteerde datum
FROM
        archief a
WHERE a.datum = (SELECT MAX(b.datum) FROM archief b WHERE b.tek_id = a.tek_id)


ofzoiets

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life

Pagina: 1