Toon posts:

[MySQL] Gevens binnen halen zonder een bepaald ID

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Op dit moment probeer ik een query te verzinnen die moet doen wat ik wil. De bedoeling is dat er een bepaald item geselecteerd kan worden, dat de query dan gaat kijken naar elk rij die dat item heeft maar dan niet zal weergeven. (klinkt een beetje raar ok ik weet ik)

Even een kleine indruk van de tabellen die ik heb

Tabel menu:
menu_id
menu_price
menu_description
restaurant_id
type_id

Tabel ingredients:
ingredients_id
ingredients_name

Tabel menu_ingredient:
menu_id
ingredients_id

In de tabel menu komen de menu's te staan. In de ingredienten staan de beschikbaren ingredienten. Om nou de ingredienten bij de menu's te krijgen heb ik een losse tabel gemaakt die alle gegevens koppelt (voor de ingredienten aan het menu dan)

Query die weergeeft van de menu's met een bepaald ingredient lukt wel:

SELECT menu.menu_id, menu.menu_name, menu.menu_price, menu.menu_description
FROM menu, menu_ingredient
WHERE menu_ingredient.ingredients_id = 5 AND menu.menu_id = menu_ingredient.menu_id GROUP BY menu.menu_id

Dus dat is het probleem niet echt. Maar het probleem is meer op het moment dat ik een menu zoek ZONDER een bepaald ingredient.

Als ik dan doe:

SELECT menu.menu_id, menu.menu_name, menu.menu_price, menu.menu_description
FROM menu, menu_ingredient
WHERE menu_ingredient.ingredients_id <> 5 AND menu.menu_id = menu_ingredient.menu_id GROUP BY menu.menu_id

Krijg ik dezelfde resultaten. Reden: Omdat er ook een rij bestaat van die bepaalde menu's die dus niet nummer 5 hebben. dus wat hij eigenlijk zou moeten doen, is kijken welke menu_id het ingredient_id 5 heeft die menu_id onthouden en dan dus die ook wegschrijven.

Nu had ik wel iets geprobeert maar ik denk dat het fouten geeft omdat er meerdere resultaten uit de sub query komen:

SELECT menu.menu_id, menu.menu_name, menu.menu_price, menu.menu_description
FROM menu
INNER JOIN menu_ingredient
ON menu.menu_id=menu_ingredient.menu_id
AND menu_ingredient.ingredients_id <> '5'
AND menu_ingredient.menu_id <> (SELECT menu_ingredient.menu_id FROM menu_ingredient WHERE menu_ingredient.ingredients_id = ‘5’)

(owja de eerste query kan ik eventueel ook nog als een JOIN doen, maar is nog niet echt bepaald nodig maar heb ik wel in een JOIN geschreven alsnog)...

Heeft iemand enige ideeen hoe ik dit kan oplossen? Mochten jullie nog meer info nodig hebben hoor ik dat vanzelf wel. Ik ben al de hele ochtend bezig geweest ongeveer, maar wil nog niet echt lukken. Google/GOT ook al afgezocht, maar nog niet echt bepaald mijn antwoord kunnen vinden.

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 01:25

The Eagle

I wear my sunglasses at night

Probeer eens te werken met iets als
WHERE ingedient NOT IN (select distinct(ingredient) from ingredienten where ingredient= $zoekstring)

ofzo :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Verwijderd

Topicstarter
Krijg een fout op de query:

SELECT menu.menu_id, menu.menu_name, menu.menu_price, menu.menu_description
FROM menu, menu_ingredient
WHERE menu_ingredient.ingredients_id NOT
IN (

SELECT (
DISTINCT menu_ingredient.ingredients_id
)
FROM menu_ingredients
WHERE menu_ingredient.ingredients_id = '3'
)
AND menu.menu_id = menu_ingredient.menu_id


of ik doe het helemaal verkeerd of ik wordt gek (tweede kan best wel het geval zijn... zo maar is ff wat drinken halen voordat ik hierow uitdroog :P )

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 01:25

The Eagle

I wear my sunglasses at night

Is een schoolopdracht zeker? Komt me wel erg bekend voor namelijk ;)

Even GoT-search voor je gebruikt op de termen "ingredient" en "school":
Tada:
[access] left join expression not supported?
\[php/mysql] Sub query

Weinig inventief die docenten, pizza's worden ineens menu's maar het principe blijft het zelfde :P

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op vrijdag 22 september 2006 @ 20:50:
Krijg een fout op de query:
..query..
of ik doe het helemaal verkeerd
Wat je verkeerd doet, is zeggen dat er 'een fout' is. Het idee van een foutmelding is dat het een hint kan geven van wat er fout gaat, dus kijk daar naar en meldt zo'n foutmelding dan ook hier als je er echt niet zelf uit komt.

{signature}


Verwijderd

Haakjes in de 2e select staan op de verkeerde plek.

Verwijderd

Topicstarter
Ok, nieuwe week nieuwe kansen. Wat ik nu aan het proberen ben is eerst gewoon alleen de menu_id's er uit te krijgen van de menu_ingredient tabel. (ow btw het is geen school opdacht ;) )

Op het moment dat ik dat probeer bljif ik errors krijgen :S

SELECT *
FROM menu_ingredient
WHERE NOT
EXISTS (


SELECT *
FROM menu_ingredient
WHERE ingredients_id = '5'
)
GROUP BY menu_id
LIMIT 0 , 30

MySQL said:

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXISTS ( SELECT * FROM menu_ingredient WHERE ingredients_i


Als ik mijn subquery gewoon los draai krijg ik de twee menu_id's terug die dus het ingredient nr 5 bevatten. Dat zijn dus de twee die ik wil uitfilteren. Als ik kijk naar de twee links van The_Eagle kijk zou mijn query toch wel moeten werken heb ik zomaar het idee. Trouwens de MySQL versie die ik gebruik is 4.1.15

Ook als ik probeer met NOT IN lukt ie nog niet

SELECT *
FROM menu_ingredient
WHERE menu_id NOT
IN (


SELECT *
FROM menu_ingredient
WHERE ingredients_id = '5'
)
GROUP BY menu_id
LIMIT 0 , 30

MySQL said:

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT * FROM menu_ingredient WHERE ingredients_id = '5' )

(er staan nu * maar ik heb ook met gewoon alleen menu_id geprobeerd geeft ook nog fouten)

Is dit een probleem van de versie van MySQL? Waar anders loopt het binnen mijn query niet goed? Iemand die mij een klein beetje kan helpen... :$

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 00:41

TeeDee

CQB 241

Misschien dat je je subquery aan moet passen zodat er geen
SQL:
1
2
3
SELECT *
FROM menu_ingredient
WHERE ingredients_id = '5'
staat, maar
SQL:
1
2
3
SELECT menu_id
FROM menu_ingredient
WHERE ingredients_id = 5

Heb hier even geen Analyzer bij de hand, maar dat zou in ieder geval je query een stuk logischer in elkaar zetten.

Edit: ah, dat heb je al gedaan.

Volgens mij ondersteund jouw mySQL versie geen subquery.
4.1.15 zou wel subquerys moeten snappen. :)

Trouwens: een group by op menu_id terwijl je de rest niet expliciet op haalt (of in aggregate functies) zou volgens de spec imo een error op moeten leveren. Het kan ook zijn dat dit een bug is die in het 'beruchte' lijstje van ACM stond.

[ Voor 35% gewijzigd door TeeDee op 25-09-2006 14:56 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
TeeDee schreef op maandag 25 september 2006 @ 14:51:
Trouwens: een group by op menu_id terwijl je de rest niet expliciet op haalt (of in aggregate functies) zou volgens de spec imo een error op moeten leveren. Het kan ook zijn dat dit een bug is die in het 'beruchte' lijstje van ACM stond.
Dat is een MySQL 'feature'.

{signature}


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13-02 11:06

Janoz

Moderator Devschuur®

!litemod

Die group by slaat sowieso nergens op. Er wordt immers in de complete query geen enkele aggregerende functie gebruikt. Ik snap dan ook niet wat de topicstarter hiermee wil bereiken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
de bedoeling van de Group by op dit moment is om alleen enkele menu id's uit de query te halen. Op het moment dat ik die group by niet gebruikt krijg ik dus 12 keer het zelfde menu_id uit een query.

Query resultaat bij
SQL:
1
2
3
SELECT menu_id
FROM menu_ingredient
WHERE ingredients_id = '5'

Resultaat:
menu_id
25
26
SQL:
1
2
3
SELECT menu_id
FROM menu_ingredient
WHERE ingredients_id <> '5'

Resultaat:
menu_id
23
23
24
24
25
25
26
26

wanneer ik hier een GROUP BY menu_id bij zet krijg ik als resultaat:
menu_id
23
24
25
26

Vandaar dat ik de group by gebruik. Maar ook zonder de Group by krijg ik nog steesd dezelfde error. Dus het ligt volgens mij niet bij de group by statement

Edit:
Ik zou natuurlijk ook kunnen gebruiken
SQL:
1
2
3
SELECT DISTINCT menu_id
FROM menu_ingredient
WHERE ingredients_id <> '5'

[ Voor 8% gewijzigd door Verwijderd op 25-09-2006 16:06 ]


Verwijderd

De query ziet er goed uit, misschien dat jouw mysql geen subqueries ondersteunt...

Verwijderd

Topicstarter
en ja hoor.. Het probleem was inderdaad dat mijn MySQL versie geen subqueries ondersteund. Ik heb nu MySQL lokaal geinstalleerd, ff alle gegevens over gezet en de query opnieuw geprobeerd. En het werkt... Pffff k*t hosting :P

In ieder geval allemaal bedankt voor het meedenken en jullie hulp!!
Pagina: 1