Toon posts:

[mysql] Alléén originele velden selecteren

Pagina: 1
Acties:

Verwijderd

Topicstarter
De opmaak van het databasemodel:

Afbeeldingslocatie: http://home.planet.nl/~kempe433/overig/dbmodel.jpg

De query:
code:
1
2
3
4
5
6
7
8
           SELECT 
                contest_years_contests.contest_year_id, contest_years_contests.contest_id, contest_years.contest_year
           FROM 
                contest_years_contests, contest_years
           WHERE
                contest_years_contests.contest_year_id = contest_years.contest_year_id
           ORDER BY
                contest_years.contest_year



Zoals jullie kunnen zien is het dus de bedoeling om o.a. de gelinkte jaren uit de jarentabel te destilleren (er staan in het volledige model natuurlijk meerdere jaren in de jarentabel). Het probleem is alleen dat er bij de bovenstaande query meer dan een keer een jaar kan worden geselecteerd. Dit gebeurt omdat er meerdere wedstrijden aan een jaar gelinkt kunnen worden.

Welnu, ik heb om dit probleem tegen te gaan de volgende twee oplossingen bedacht:

1. Een php-functie die de dubbele jaren verwijderdt (nadat ze uit de database zijn gedestilleerd).

2. Een extra kolom in de jarentabel waarin ik doormiddel van een integer het aantal bindingen bijhoud. Je zou dan een volgende query kunnen krijgen om de gelinkte jaren op te halen: SELECT jaar FROM jaren WHERE bindingen > 0.

Echter ben ik benieuwd of jullie met een mooiere oplossing kunnen komen. Is het bijvoorbeeld mogelijk om een commando in een query te zetten waardoor er alleen originelen worden geselecteerd? Waardoor er dus niet meer dan 1x dezelfde waarde wordt geselecteerd?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 26-05 22:35

Creepy

Tactical Espionage Splatterer

distinct?

"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


  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 02-05 12:11

dArtagnan

Een voor allen, allen voor een

Dit kun je waarschijnlijk oplossen met een JOIN.
http://www.w3schools.com/sql/sql_join.asp

Probeer de onderstaande query eens
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT 
   contest_years_contests.contest_year_id, 
   contest_years_contests.contest_id, 
   contest_years.contest_year
FROM 
   contest_years_contests
LEFT JOIN contest_years
   ON contest_years_contests.contest_year_id = contest_years.contest_year_id
ORDER BY
   contest_years.contest_year

[ Voor 69% gewijzigd door dArtagnan op 24-03-2004 16:29 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Koraalduivel schreef op 24 maart 2004 @ 16:27:
Dit kun je waarschijnlijk oplossen met een JOIN.
http://www.w3schools.com/sql/sql_join.asp

Probeer de onderstaande query eens
Dat is exact dezelfde query als hijzelf al heeft, met als enige verschil dat ook contenst_years_contests worden opgehaald waar geen contest_years bij is...

Zoiets lijkt me nuttiger:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
   contest_years.contest_year,
   COUNT(contests_years_contests.contest_id) AS num_contests
FROM 
   contest_years
   LEFT JOIN  contest_years_contests
      ON contest_years.contest_year_id = contest_years_contests.contest_year_id
GROUP BY
   contest_years.contest_year
HAVING
   num_contests > 0
ORDER BY
   contest_years.contest_year


Als je de originele query met deze combineert (en dus geen left join neemt) hoef je die HAVING niet eens te gebruiken.
Verder hangt de toepasbaarheid van deze query natuurlijk samen met wat je nou precies wilt :)

[ Voor 12% gewijzigd door ACM op 24-03-2004 16:38 ]


Verwijderd

Topicstarter
Ja GROUP BY moest ik inderdaad hebben. Thanks ACM!

Ik vraag me alleen af wat beter en/of sneller is om te gebruiken:


code:
1
2
3
4
5
6
7
8
           SELECT 
                contest_years_contests.contest_id, contest_years.contest_year
           FROM 
                contest_years_contests, contest_years
           WHERE
                contest_years_contests.contest_year_id = contest_years.contest_year_id
           ORDER BY
                contest_years.contest_year


of:

code:
1
2
3
4
5
6
7
8
9
10
SELECT
     contest_years_contests.contest_id, contest_years.contest_year
FROM
     contest_years_contests
INNER JOIN
     contest_years
ON
     contest_years_contests.contest_year_id = contest_years.contest_year_id
ORDER BY
     contest_years.contest_year



Oftwel: INNER JOIN of selecteren uit twee tabellen?

[ Voor 4% gewijzigd door Verwijderd op 25-03-2004 14:28 ]