[SQL] Distinct op 1 kolom

Pagina: 1
Acties:

  • StarLite
  • Registratie: Januari 2000
  • Laatst online: 01-12-2025

StarLite

'ON ERROR RESUME NEXT

Topicstarter
Ik zit met een SQL probleempje.
Ik heb de volgende query:
SQL:
1
2
3
4
5
6
7
SELECT m.mda_id, m.mda_name, f.mdf_media, f.mdf_filesize, q.mdq_name, max(q.mdq_id)
FROM mda_media m 
LEFT OUTER JOIN mdf_mediafile f on m.mda_id = f.mda_id
LEFT OUTER JOIN mdq_mediaquality q on f.mdq_id = q.mdq_id 
AND m.mda_id IN (SELECT mda_id FROM mda_mkw mk, mkw_mediakeywords k WHERE mk.mkw_id = k.mkw_id ) 
GROUP BY m.mda_id, m.mda_name, f.mdf_media, f.mdf_filesize, q.mdq_name
ORDER BY m.mda_id


Die de volgende output geeft:
1	Springende walvis	beeld_02.jpg	34190	web	1
1	Springende walvis	whale(jump).jpg	55837	print	2
[...]
18	Test	NULL	NULL	NULL	NULL
19	test	NULL	NULL	NULL	NULL


Nu is het probleem dat de 1e 2 results over hetzelfde mda_id gaan. Ik wil graag alleen de record met de max mdq_id hebben, maar ik krijg het niet voor elkaar. Ik heb het gevoel dat ik iets simpels over het hoofd zie...

De tabel-definities:
mda_media:
code:
1
2
INSERT INTO [rochdale_media_archief].[dbo].[mda_media]([mda_id], [mdt_id], [usr_id], [mdr_id], [mda_name], [mda_created_at], [mda_edited_at], [mda_created_by], [mda_edited_by], [mda_definition], [mda_orientation])
VALUES(<mda_id,int,>, <mdt_id,int,>, <usr_id,int,>, <mdr_id,int,>, <mda_name,varchar(250),>, <mda_created_at,datetime,>, <mda_edited_at,datetime,>, <mda_created_by,varchar(250),>, <mda_edited_by,varchar(250),>, <mda_definition,text,>, <mda_orientation,varchar(250),>)


mda_media:
code:
1
2
INSERT INTO [rochdale_media_archief].[dbo].[mdf_mediafile]([mdf_id], [mda_id], [mdq_id], [mdf_media], [mdf_filesize], [mdf_filetype])
VALUES(<mdf_id,bigint,>, <mda_id,int,>, <mdq_id,int,>, <mdf_media,varchar(250),>, <mdf_filesize,varchar(250),>, <mdf_filetype,varchar(250),>)


mdq_mediaquality:
code:
1
2
INSERT INTO [rochdale_media_archief].[dbo].[mdq_mediaquality]([mdq_id], [mdq_name], [mdq_dpi_min], [mdq_dpi_max], [mdq_definition])
VALUES(<mdq_id,int,>, <mdq_name,varchar(250),>, <mdq_dpi_min,varchar(250),>, <mdq_dpi_max,varchar(250),>, <mdq_definition,text,>)

[ Voor 52% gewijzigd door StarLite op 18-07-2005 13:30 ]

tyrips, tywreps, tiewreps, tiereps, tie raps, ripties, taiwraps, kabelbindbandjes » Tie Wraps
\o/


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Een distinct kun je wel gebruiken, maar dan met 1 kolom. Dat schiet dus niet op...

Wat je kan doen is de join leggen op Max of Min. Dit kun je dan in de where clause regelen:

where J.Field1 = (select Max(Field1) from TableJ)

Dit is uiteraard nogal 'pseudo-code'

[ Voor 8% gewijzigd door Robbemans op 19-07-2005 11:55 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Robbemans schreef op dinsdag 19 juli 2005 @ 11:54:
Een distinct kun je wel gebruiken, maar dan met 1 kolom. Dat schiet dus niet op...

Wat je kan doen is de join leggen op Max of Min. Dit kun je dan in de where clause regelen:

where J.Field1 = (select Max(Field1) from TableJ)

Dit is uiteraard nogal 'pseudo-code'
Deze MAX geldt dan ook nog voor de hele tabel, niet voor de max per mdq_id. Dat gaat dus niet werken.

Je kunt het volgende doen: (iets vereenvoudigd)
SQL:
1
2
3
4
5
SELECT m.mda_id, m.mda_name, f.mdf_media, f.mdf_filesize, q.mdq_name,q.mdq_id
FROM mda_media m 
LEFT OUTER JOIN mdf_mediafile f on m.mda_id = f.mda_id 
LEFT OUTER JOIN mdq_mediaquality q on f.mdq_id = q.mdq_id
WHERE q.mdg_id = (SELECT MAX(id) FROM mdq_mediaquality WHERE mdq_id = f.mdq_id)


Let er wel op dat de left outer join met mdq_mediaquality op deze manier geen zin heeft, het zal effectief een INNER JOIN worden omdat je q.mdq_id in de WHERE clausule opneemt. Ik weet niet of dat erg is? Daarnaast wordt de subquery in de WHERE clausule uitgevoerd voor iedere rij, dit gaat wel ten koste van de performance. Als het te traag gaat is er denk ik nog wel een manier die joined met een subquery. Dat zal sneller gaan.

Als het maar om 1 veld uit de mediaquality tabel gaat, kun je het ook in je select opnemen

SQL:
1
SELECT m.mda_id, m.mda_name, f.mdf_media, f.mdf_filesize, (SELECT TOP 1 mdq_name FROM mdq_mediaquality WHERE mdq_id = f.mdq_id ORDER BY id DESC) as mdg_name

[ Voor 9% gewijzigd door P_de_B op 19-07-2005 15:18 ]

Oops! Google Chrome could not find www.rijks%20museum.nl