Toon posts:

[MySQL] JOIN met alleen nieuwste product

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik zit met een klein mysql probleempje, mijn db systeem zit ietwat moeilijker in elkaar, maar als voorbeeld kan ik het onderstaande voorbeeld uit de faq nemen:

P&W FAQ - SQL (zie deze url voor uitleg hoe de tabellen in elkaar zitten)

code:
1
2
3
4
5
6
7
8
9
SELECT
   category.name,
   category.id,
   product.product_id
FROM
   category
      LEFT JOIN product 
         ON(category.id=product.category_id)
   ;


nu vroeg ik mij af of het mogelijk is om per categorie alléén het nieuwste product te weergeven (aannemend dat er ook een kolom datum/tijd is) ?
dus ookal zijn er meerdere producten, alleen de nieuwste

bij voorbaat dank :)

(ik heb al geprobeerd ORDER BY product.datumtijd LIMIT 0,1, maar dat werkte niet, zou t verder niet weten?)

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 21-05 20:52

Guldan

Thee-Nerd

dit kan wel maar dan moet je met een timestamp werken. dat is een soort getal wat de datum aangeeft.

PHP:
1
SELECT datum FROM tabelnaam ORDER BY date DESC Limit 0,1


hiermee pakt hij de hoogste datum waarde uit een tabel mits dit een timestamp is. Meer info over timestamps staan wel op www.php.net/date.

[edit]

heb niet zoveel verstand van joins maar je gedachte is goed je moet alleen ORDER BY date DESC Limit 0,1 erbij zitten mits de datum een timestamp is.

[ Voor 21% gewijzigd door Guldan op 30-07-2004 19:52 ]

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Met LIMIT ga je er nooit komen, omdat je dan altijd maar 1 rij terugkrijgt.
Als ik de TS begrijp wil hij een overzicht van het nieuwste product van alle categoriën en niet van slechts 1 categorie.

Ik zit te twijfelen of je dit wel in 1 query kan oplossen ook omdat MySQL geen subqueries ondersteunt, tenzij je met een recente MySQL versie werkt. Welke MySQL versie gebruik je?

It’s nice to be important but it’s more important to be nice


Verwijderd

Topicstarter
JonkieXL schreef op 30 juli 2004 @ 19:57:
Met LIMIT ga je er nooit komen, omdat je dan altijd maar 1 rij terugkrijgt.
Als ik de TS begrijp wil hij een overzicht van het nieuwste product van alle categoriën en niet van slechts 1 categorie.

Ik zit te twijfelen of je dit wel in 1 query kan oplossen ook omdat MySQL geen subqueries ondersteunt, tenzij je met een recente MySQL versie werkt. Welke MySQL versie gebruik je?
yup, zoals jij het nu zegt begrijp je het goed, ik wil een overzicht van het nieuwste product per categorie hebben.

ik gebruik MySQL versie 4.0.20-standard, gaat het dan met subqueries?
ik weet dat het met een query extra heel eenvoudig op te lossen is, maar ik heb een 40 a 50 categorieen, dus dat is 40 of 50 keer een query extra als ik van elke het nieuwste product wil laten zien.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:49

Creepy

Tactical Espionage Splatterer

En een MAX(datumtijd) i.c.m. met een group by category.name, category.id?

[ Voor 13% gewijzigd door Creepy op 30-07-2004 20:15 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Creepy schreef op 30 juli 2004 @ 20:13:
En een MAX(datumtijd) i.c.m. met een group by category.name, category.id?
Dan zit je met het probleem dat je alleen velden kunt selecteren waarop je groupeert en dus niet de productnaam kunt tonen.

Subqueries worden overigens pas ondersteund vanaf MySQL 4.1 zie http://dev.mysql.com/doc/mysql/en/ANSI_diff_Subqueries.html

Zit me af te vragen of je niet beter een extra koppeltabel kunt gebruiken om een product aan een categorie toe te wijzen, bijvoorbeeld:

product_relation
--------------
product_id
category_id
PRIMARY KEY(product_id,category_id)

Zo heb je ook een mogelijkheid om producten aan meerdere categorieën te koppelen.

It’s nice to be important but it’s more important to be nice


  • argi
  • Registratie: Juni 2000
  • Laatst online: 22-05 21:42
Ik heb eens met hetzelfde probleem te maken gehad. Dit had ik opgelost door middel van twee queries (aangezien mysql geen subqueries ondersteund). Dit heb ik als volgt gedaan:

1. Haal de producten id's op met daarbij de laatste datum/tijd

code:
1
SELECT `product`.`id` , MAX( `product`.`date_time` ) AS date_time FROM `product` GROUP BY `product`.`id`


2. Construeer een filter voor de tweede query

code:
1
2
3
4
5
6
7
8
        for ($i=0; $i < $num_results1; $i++) {
                $row1 = mysql_fetch_array($result1);
                if ($i==0) {
                        $filter = " WHERE (`product`.`date_time` = '".$row1["date_time" ]."' AND `product`.`id` = ".$row1["id"].")";
                } else {
                        $filter = $filter ." OR (`product`.`date_time` = '".$row1["date_time" ]."' AND `product`.`id` = ".$row1["id"].")";
                }
        }


3. Voer de tweede query uit

code:
1
2
3
        $query2 = "SELECT `product`.`naam` , `product`.`whatever` , 
        . " FROM product"
        . $filter;


Ik hoop dat je hier wat mee kunt.

[ Voor 10% gewijzigd door argi op 30-07-2004 21:26 ]


Verwijderd

Topicstarter
thnx argi, dat is wat ik nu ook al doe, maar ik dacht dat het simpeler zou kunnen met een join, thnx in ieder geval, zal wel niet kunnen dan denk ik...

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Waarom werkt dit niet dan? Wat krijg je voor fout? Of krijg je gewoon foute waarden? Leg eens uit?
code:
1
2
3
4
5
6
7
8
9
10
SELECT
   category.name,
   category.id,
   product.product_id
FROM
   category
LEFT JOIN product 
ON category.id = product.category_id
ORDER BY datumveld
LIMIT 1

Dit zou volgens mij gewoon moeten werken?

Overigens, doe eens een topicreport om de topictitel goed te krijgen. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
ahja beetje dom die titel inderdaad, moest er nog wat achterzetten maar vergat het.
en ik zie niet dat ik fouten kreeg, alleen dat het niet het gewensde resultaat geeft, ik wil namelijk maar 1 product zien:)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 30 juli 2004 @ 22:54:
ahja beetje dom die titel inderdaad, moest er nog wat achterzetten maar vergat het.
en ik zie niet dat ik fouten kreeg, alleen dat het niet het gewensde resultaat geeft, ik wil namelijk maar 1 product zien:)
En wat zie je dan wel bij de query die ik postte?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23-05 18:13
NMe84: jouw suggestie werkt niet omdat LIMIT het totaal aantal resultaten beperkt. Je krijgt zo dus maximaal 1 resultaat terug. De topic starter wil echter 1 resultaat per categorie (en dan nog specifiek het nieuwste product uit die ene categorie).

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Soultaker schreef op 31 juli 2004 @ 02:10:
NMe84: jouw suggestie werkt niet omdat LIMIT het totaal aantal resultaten beperkt. Je krijgt zo dus maximaal 1 resultaat terug. De topic starter wil echter 1 resultaat per categorie (en dan nog specifiek het nieuwste product uit die ene categorie).
Ah, overheen gelezen. Dan is volgens mij de oplossing van JonkieXL hierboven (dus met een koppeltabel) de beste. Zo ga ik in ieder geval altijd te werk, en dan is de database ook netjes genormaliseerd. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1