[mysql] Subselect workaround ?

Pagina: 1
Acties:
  • 135 views sinds 30-01-2008
  • Reageer

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17
Hoi allemaal,

Na wat geRTFM en geUTFS kom ik hier toch niet uit. Ik wil in MySQL een query uitvoeren die het volgende doet (in 'normaal' sql) :
code:
1
SELECT * FROM tabel1 WHERE tabel1.id IN (SELECT DISTINCT id FROM tabel2)

Wie o wie kan mij helpen en mijn dag weer wat zonniger maken 8-)

SIZE does matter.
"You're go at throttle up!"


  • tomato
  • Registratie: November 1999
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
   tbl1.id,
   COUNT(tbl2.id) AS Aantal
FROM
   tabel1 tbl1
   INNER JOIN
    tabel2 tbl2
    ON
    tbl1.tbl2_id = tbl2.id
WHERE
   Aantal = 1
GROUP BY
   tbl1.id

Zal zoiets wel kunnen denk ik. Let wel op het kleine verschil in datamodel dat ik aanneem, ben je hier niet tevreden mee, dan zie ik hier graag je datamodel plus uitleg.

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17
Hmm.. dat werkt dus niet helemaal.
Werkt INNER JOIN wel in MySQL ? (Ken dat alleen van Access)..


Even een iets completer verhaaltje :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Files
-----
id INT
description VARCHAR
url VARCHAR

Files_Categorieen
-----------------
id INT
parent_id INT 
name VARCHAR

Files_Per_Categorie
-------------------
files_id INT 
cat_id INT

Hopelijk is dat een beetje duidelijk, het is dus een soort driver database. Nu wil ik dus een lijstje maken met daarin de laatst toegevoegde items. Het feit is alleen dat als je een file aan meerdere categorieen toevoegd dat je hem dan met een simpele select meerdere keren in de tracker ziet staan...

SIZE does matter.
"You're go at throttle up!"


  • tomato
  • Registratie: November 1999
  • Niet online
Pardon, ik las te snel en had niet goed begrepen wat je precies wilt doen :o

Maar dan begrijp ik nu niet zo goed wat eigenlijk je probleem is. Een simpele SELECT uit je 'Files' tabel geeft toch geen dubbele drivers :?
Ik zie ook nergens een datum/tijd veld?

[edit]
Oja, dit:
Hmm.. dat werkt dus niet helemaal.
zegt mij dus niet zo veel (ik type het ook maar eventjes in zonder te testen), geef dan wat meer informatie over wat er niet goed gaat. Overigens is dat in dit geval niet meer nodig omdat ik je probleem verkeerd begreep ;)

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17
Ben inderdaad niet helemaal 100% volledig geweest .... Moi fout! ;)

Er zijn wel degelijk timestamp veldjes, maar dit zijn de velden die volgens mij van belang zijn voor het bouwen van een goede query.

Je kan inderdaad
code:
1
SELECT * FROM files ORDER BY timestamp DESC LIMIT 0,5

doen, maar....
In de tracker wil ik de text als link naar de file weergeven en daarvoor heb ik de (lees 'een') categorie nodig en die staat niet in de tabel 'files'. Als ik 'files' en 'files_per_cat' koppel dan ontstaat er dubbele items omdat ze in meerdere categorieen kunnen staan

Gewenste output is dus :
code:
1
<A HREF='files.php?cat=x&id=y'>Omschrijving</A>

waarbij
code:
1
2
x = files_per_cat.cat_id
y = files.id

Comprende ? :)

SIZE does matter.
"You're go at throttle up!"


  • tomato
  • Registratie: November 1999
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
   fls.id,
   fls.description,
   fpc.cat_id
FROM
   Files fls
   LEFT JOIN
    Files_Per_Categorie fpc
    ON
    fls.files_id = fpc.cat_id
GROUP BY
   fls.id
ORDER BY
   fls.timestamp DESC
LIMIT
   0, 5

Ok, dan zal het wel zoies worden...

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 10-05 16:53
Soms wel vervelend he, dat MySQL normaal gesproken geen subqueries ondersteunt? Awel, een andere oplossing is:

1) doe eerst een subquery en maak met je script een string met (bv) de id's van deze query
2) doe de main query
"SELECT bla FROM blatable WHERE eenofanderekolom IN ($subquery)"

Werkt goed en is ook best snel.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op maandag 03 september 2001 19:13 schreef Skinny het volgende:
Hoi allemaal,

Na wat geRTFM en geUTFS kom ik hier toch niet uit. Ik wil in MySQL een query uitvoeren die het volgende doet (in 'normaal' sql) :
code:
1
SELECT * FROM tabel1 WHERE tabel1.id IN (SELECT DISTINCT id FROM tabel2)

Wie o wie kan mij helpen en mijn dag weer wat zonniger maken 8-)
ten eerste: ignore dirkpostma erg slechte manier.
code:
1
SELECT distinct tabel1.* from tabel1, tabel2 where tabel1.id=tabel2.id

That's all.

( En jah, dit is alleen gebaseerd op de specificatie in de eerste bericht >:) )

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17
Dank voor de reakties..

De oplossing van tomato is met enig boetseerwerk werkend gekregen. De oplossing met twee queries heb ik ook geprobeerd (al voor ik hier gepost had), maar ik wist gewoon dat het in 1 query mogelijk moest zijn...

resultaat :
code:
1
2
3
4
5
6
7
8
9
10
SELECT 
files_id, 
cat_id,
headline,
date_format(timestamp,'%d/%m') as timestamp
FROM files 
LEFT JOIN files_per_cat ON files_per_cat.files_id = files.id 
GROUP BY files.id 
ORDER BY timestamp DESC 
LIMIT 0,5

Thnx!

SIZE does matter.
"You're go at throttle up!"

Pagina: 1