[PHP/MySQL]Ingewikkelde query met Distinct

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RadioheadRules
  • Registratie: November 2003
  • Laatst online: 12-03-2009
Ik ben bezig met een film database waar een select groepje kennissen toegang tot heeft om van elkaar te zien welke films we hebben etc.

Onder andere heb ik de volgende tabellen:

users
user_ID
user_username
etc

films
film_ID
film_naam
etc

eigenaars
eig_ID
eig_film_ID
eig_user_ID

In film tabel staan alle films. In de eigenaar tabel worden users dus aan films gekoppeld om op te bepalen wie welke film heeft. Dit krijg ik er ook allemaal uit enzo, alleen ik probeer nu voor elkaar te krijgen om te zien welke films er allemaal in de films tabel staan, maar NIET aan mijn account gekoppeld zijn.

Ik heb nu de volgende code:
PHP:
1
2
3
4
5
6
7
$query = mysql_query("SELECT DISTINCT ( eig_film_ID ) AS IDtje FROM eigenaars WHERE eig_user_ID != '".$_GET['user_ID']."'") or die(mysql_error());
        while($row = mysql_fetch_assoc($query))
        {
            $query2 = mysql_query("SELECT * FROM films WHERE film_ID = '".$row['IDtje']."'") or die(mysql_error());
            $row2 = mysql_fetch_assoc($query2);
            echo "".$row2['film_naam']." | <b>".$row2['film_ID']."</b><br>";
        }


De eerste query haalt dus film ID's uit de eigenaars tabel die niet aan een speficieke gebruiker gekoppeld zijn. De 2e query selecteerd dus de film, zodat ik de naam kan displayen etc.
Helaas zitten er dus toch films tussen die WEL aan mijn account gekoppeld zijn. Ik denk dat dit komt, omdat de DISTINCT pas op het einde gebeurd, terwijl je verwacht dat hij als eerst DISTINCT doet en daarna pas de rest van de query.
Misschien een beetje een ingewikkeld verhaal :? dus als er nog iets onduidelijk is, let me know!

[ Voor 7% gewijzigd door RadioheadRules op 09-06-2004 22:47 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
SELECT veldjes FROM users
INNER JOIN eigenaars ON eigenaars.userid=users.id
INNER JOIN films ON eigenaars.filmid=film.id WHERE users.id!=mijnid

Acties:
  • 0 Henk 'm!

  • RadioheadRules
  • Registratie: November 2003
  • Laatst online: 12-03-2009
djluc schreef op 09 juni 2004 @ 23:00:
SELECT veldjes FROM users
INNER JOIN eigenaars ON eigenaars.userid=users.id
INNER JOIN films ON eigenaars.filmid=film.id WHERE users.id!=mijnid
Bedankt, maar helaas toont hij nog steeds films die ik al wel heb. Dit zijn wel films die meerere personen in bezit hebben. Een film_ID kan dus meerdere keren voorkomen in de eigenaars tabel. Vandaar dat ik dus DISTINCT gebruik, maar volgens mij distinct hij de ID's pas nadat de query is uitgevoerd (of hoe zeg je dat :?)

Ik hoop dat iemand me alsnog kan helpen? Code tot nu toe is dus:
PHP:
1
2
3
4
5
6
$query = mysql_query("SELECT * FROM users INNER JOIN eigenaars ON eigenaars.eig_user_ID = users.user_ID INNER JOIN films ON eigenaars.eig_film_ID = films.film_ID WHERE users.user_ID != '".$_GET['user_ID']."' ORDER BY films.film_naam") or die(mysql_error());
        while($row = mysql_fetch_assoc($query))
        {
            $row = mysql_fetch_assoc($query);
            echo "".$row['film_naam']." | <b>".$row['film_ID']."</b><br>";
        }

[ Voor 28% gewijzigd door RadioheadRules op 09-06-2004 23:14 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je fetcht een record, en meteen daarna nog een? Niet doen dus:
PHP:
1
2
3
4
5
<?
$query = mysql_query("SELECT * FROM users INNER JOIN eigenaars ON eigenaars.eig_user_ID = users.user_ID INNER JOIN films ON eigenaars.eig_film_ID = films.film_ID WHERE users.user_ID != ".$_GET['user_ID']." ORDER BY films.film_naam") or die(mysql_error());
        while($row = mysql_fetch_assoc($query))
            echo $row['film_naam']." | <b>".$row['film_ID']."</b><br>";
?>

En waarom heb je op regel 5 in Godsnaam een "". achter je echo staan? Dat doet nix... :/

Edit:
En waarom zet je een ID tussen quotes? Ik mag toch aannemen dat het integers zijn?
En kijk meteen eens naar SQL Injection Attacks. :)

[ Voor 23% gewijzigd door NMe op 09-06-2004 23:20 ]

'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.


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Dan heeft een ander persoon ze, of mogen ze dan ook niet getoond worden?

Zoja:
heel evil oplossing:
SELECT filmid FROM eigenaars WHERE id=mijnid
zet allen in een array

SELECT FROM eigenaars INNER JOIN films ON filmid=film.id WHERE filmid NOT IN (implode(de array))

Acties:
  • 0 Henk 'm!

  • RadioheadRules
  • Registratie: November 2003
  • Laatst online: 12-03-2009
Oeps, dat was een restje van mn oude query 8)7.

Maar ik krijg nog steeds films die er niet tussen horen.

Wat betreft die dubbele quote; zo is me dat aangeleerd en tja, het werkt... Nu in ieder geval niet van belang.

Acties:
  • 0 Henk 'm!

  • RadioheadRules
  • Registratie: November 2003
  • Laatst online: 12-03-2009
djluc schreef op 09 juni 2004 @ 23:19:
Dan heeft een ander persoon ze, of mogen ze dan ook niet getoond worden?

Zoja:
heel evil oplossing:
SELECT filmid FROM eigenaars WHERE id=mijnid
zet allen in een array

SELECT FROM eigenaars INNER JOIN films ON filmid=film.id WHERE filmid NOT IN (implode(de array))
Inderdaad evil oplossing, want dat krijg ik niet voor elkaar :| . Wil je please de oplossing specifieker erin zetten? PLEASE?? Ben er echt al uren mee bezig :Z :Z

[ Voor 5% gewijzigd door RadioheadRules op 09-06-2004 23:25 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

djluc schreef op 09 juni 2004 @ 23:19:
Dan heeft een ander persoon ze, of mogen ze dan ook niet getoond worden?

Zoja:
heel evil oplossing:
SELECT filmid FROM eigenaars WHERE id=mijnid
zet allen in een array

SELECT FROM eigenaars INNER JOIN films ON filmid=film.id WHERE filmid NOT IN (implode(de array))
Dat is precies dezelfde query die je daarvoor postte maar dan uit mekaar gehaald en veel trager. :P

Ik snap trouwens niet helemaal wat nou het probleem is? Wat krijg je terug? En waarom is dat fout?

'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.


Acties:
  • 0 Henk 'm!

  • RadioheadRules
  • Registratie: November 2003
  • Laatst online: 12-03-2009
Het probleem is dat er films naar voren komen die ik WEL in mij bezit heb, maar dat komt, omdat er meerdere mensen zijn die die film hebben.

Ik probeer de films naar voren te krijgen die WEL in de films table staan, maar die NIET zijn gekoppeld aan mijn account.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

RadioheadRules schreef op 09 juni 2004 @ 23:33:
Het probleem is dat er films naar voren komen die ik WEL in mij bezit heb, maar dat komt, omdat er meerdere mensen zijn die die film hebben.

Ik probeer de films naar voren te krijgen die WEL in de films table staan, maar die NIET zijn gekoppeld aan mijn account.
PHP:
1
2
3
$query = "SELECT * FROM users
INNER JOIN eigenaars ON eigenaars.userid = users.id
INNER JOIN films ON eigenaars.filmid = film.id WHERE eigenaar.eig_user_ID != ".$_GET['id']

'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.


Acties:
  • 0 Henk 'm!

  • RadioheadRules
  • Registratie: November 2003
  • Laatst online: 12-03-2009
Ook die query klopt niet. Dit komt omdat een film_ID meerdere keren voorkomt in de eigenaars tabel.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

RadioheadRules schreef op 09 juni 2004 @ 23:46:
Ook die query klopt niet. Dit komt omdat een film_ID meerdere keren voorkomt in de eigenaars tabel.
Dan is het een aardig slecht datamodelletje volgens mij. :)

Probeer eens wat met distinct te regelen?

'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.


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-09 08:50

gorgi_19

Kruimeltjes zijn weer op :9

RadioheadRules schreef op 09 juni 2004 @ 23:24:
Inderdaad evil oplossing, want dat krijg ik niet voor elkaar :| . Wil je please de oplossing specifieker erin zetten? PLEASE?? Ben er echt al uren mee bezig :Z :Z
RadioheadRules schreef op 09 juni 2004 @ 23:46:
Ook die query klopt niet. Dit komt omdat een film_ID meerdere keren voorkomt in de eigenaars tabel.

Even een opmerking tussendoor; het is niet de bedoeling dat je nu achterover gaat zitten om te wachten op de oplossingen van anderen en dat je deze alleen maar gaat uitproberen. Het is niet de bedoeling van Programming & Webscripting dat alles voorgekauwd wordt :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

wordt een beetje wazige query zo, maar ja:

code:
1
2
3
4
5
6
7
8
9
SELECT films.film_ID, 
 films.film_naam, 
 count(eigenaars.eig_user_ID) as aantal, 
 min(eigenaars.eig_user_ID) as wie 
FROM films 
 LEFT JOIN eigenaars ON films.film_ID = eigenaars.eig_film_ID 
 LEFT JOIN users ON users.user_ID = eigenaars.eig_ID 
GROUP BY films.film_ID, films.film_naam 
HAVING aantal=1 AND wie=1


waarbij hier userid=1 is genomen, maar vervang het maar door een variabele.

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

  • RadioheadRules
  • Registratie: November 2003
  • Laatst online: 12-03-2009
gorgi_19 schreef op 10 juni 2004 @ 00:07:
[...]


[...]

<font color="blue">
Even een opmerking tussendoor; het is niet de bedoeling dat je nu achterover gaat zitten om te wachten op de oplossingen van anderen en dat je deze alleen maar gaat uitproberen. Het is niet de bedoeling van Programming & Webscripting dat alles voorgekauwd wordt :)
</font>
Ik snap dat dat niet de bedoeling is en ik doe dit ook echt niet hoor. Zoals ik al aan heb gegeven ben ik hier al uren mee bezig geweest, maar kom ik er echt niet uit. Ik kan ook niet helpen dat de aangeboden queries niet werken. Heb ook geprobeerd aan te passen etc, maar lukt gewoon niet.
Dan is het een aardig slecht datamodelletje volgens mij.

Probeer eens wat met distinct te regelen?
Datamodel lijkt me in orde. Ik denk dat je het probleem niet helemaal begrijpt, want zoals je ziet heb ik DISTINCT al geprobeerd, maar dat geeft ook niet het gewenste resultaat, omdat de DISTINCT op het resultaat wordt uitgevoerd en dan zijn de film_ID's die ik wel heb al geselecteerd.

Ik heb allerlei mogelijkheden geprobeerd met de aangeleverde queries, maar zonder succesvol resultaat.

Ik denk dat het volgende moet gebeuren om het juiste resultaat te krijgen:
1) Eerst alle eigenaars.eig_film_ID retrieven met een DISTINCT erop
2) Dan pas de film ID's selecteren die NIET aan een specifieke user zitten gekoppeld
3) Dan de film_ID's tonen (of naam etc)

Ik hoop dat iemand me alsnog kan helpen.

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
code:
1
2
3
4
5
6
SELECT veldjes FROM users
INNER JOIN eigenaars ON eigenaars.userid=users.id
INNER JOIN films ON eigenaars.filmid=film.id WHERE users.id!=mijnid
AND NOT EXISTS (
   SELECT filmid FROM eigenaars e WHERE e.filmid = film.id AND e.userid = mijnid
)


Even een copy paste van djluc en een kleine aanpassing.
Dit maakt echter gebruik van een subquery en dat kan dus pas vanaf MySQL versie 4 ofzo.
Dit is ongetest en er kan dus nog een foutje in zitten

Acties:
  • 0 Henk 'm!

  • RadioheadRules
  • Registratie: November 2003
  • Laatst online: 12-03-2009
Shit, m'n provider gebruikt natuurlijk Mysql 3.23.58...
Pagina: 1