Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MSSQL] Selectie tabellen met meer overeenkomsten

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

  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 18-11 20:51
Hallo,

In het relevante gedeelte van mijn database heb ik 3 tabellen:

items
Product | item | medium

senders
Product | item | sender

targets
Product | item | target

Ik wil een product selecteren waarbij ik uit een andere tabellen de doelgroep en verzender weergeef

Ik gebruik deze query:
SQL:
1
2
3
4
5
6
7
8
SELECT * FROM items, senders, targets 
WHERE items.item = senders.item 
AND items.item = targets.item 
AND targets.product = items.product 
AND senders.product = items.product
AND product ='Productnaam' 
AND sender ='Almirall' 
AND medium ='Direct mail '; 



Ik ben even helemaal in de war hoe dat nou moest. Hij blijft
maar komen met
code:
1
Ambiguous column name 'product'


Ik heb nergens kunnen vinden hoe dat nou precies moet met meerdere gelijke velden.

Zou fijn zijn als iemand me weer even opfrist.

[ Voor 0% gewijzigd door Kyoshi op 03-01-2008 23:33 . Reden: Code aanpassen naar SQL ]


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 25-10 14:28
AND senders.product = items.product
AND product ='Productnaam'
Hoe bedoel je dat je niet kunt vinden hoe dat nou precies moet met meerdere gelijke velden?

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Zoiets zou beter werken denk ik
SQL:
1
AND tabelnaam.product = 'Productnaam' 


aangezien er meerdere tabellen zijn met de kolom `product`.

[ Voor 0% gewijzigd door Face_-_LeSS op 02-01-2008 16:54 . Reden: typo ]


  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 18-11 20:51
@Face_-_LeSS: Dat is het inderdaad, bedankt. Nu werkt het wel =)

Alleen zit ik nu met het probleem dat items en product in 3 tabellen voorkomen en alledrie naar hetzelfde wijzen, hoe krijg ik de query dan zover dat ik niet meer dan het totale aantal items (ongeveer 2400 -> en dus producten) terug krijg?

[ Voor 65% gewijzigd door Kyoshi op 02-01-2008 17:29 ]


  • Valkske
  • Registratie: November 2002
  • Laatst online: 17-11 09:14
Als ik bovenstaande goed begrijp dan zitten in alle 3 tabellen niet meer records dan het totale aantal items. Dus de relaties zijn als volgt:
product/item heeft max 1 medium
product/item heeft max 1 target
product/item heeft max 1 sender

Dan moet je volgens de normalisatie regels maar 1 tabel maken:
product-item-medium-target-sender

En dan eventueel lookup tabellen:
Targets
target - target_address - ...
Senders
sender - sender_address - ...

[ Voor 14% gewijzigd door Valkske op 03-01-2008 10:54 ]


  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 18-11 20:51
Ik zat het wat beter uit (proberen te) leggen.

Het gaat over een reclamedatabase.

- Over 1 product kunnen meerdere reclamestukken (items) verstuurd zijn.
- Per item kan het medium en de doelgroep verschillen, aangezien dat dan een andere zending is.

Wat ik nu wil is dat ik door middel van een SELECT-query daar dynamisch via een webpagina de query aan kan passen; hiermee bedoel ik door aan het einde van de query toe te voegen:
SQL:
1
WHERE target='huisarts';
of
SQL:
1
WHERE medium='Direct-mail';


Dat lukt overigens allemaal prima, alleen de werking en de correcte SQL syntax in vergelijking met wat ik bedoel is het probleem.

Ik werk vanuit een bestaande situatie en dat wil ik zoveel mogelijk intact houden, maar het lijkt mij toch wel makkelijker om de tabel targets en senders te verwijderen en dat bij te voegen in de tabel items aangezien daar alle items toch al in staan (eigenlijk alleen zonder targets en senders, verder alle benodigde gegevens) en dus 2 extra kolommen ook niet uitmaakt.

Kan iemand me daar een advies over geven?

  • Crayne
  • Registratie: Januari 2002
  • Laatst online: 17-03 13:41

Crayne

Have face, will travel

Ik denk dat je beter af bent met een stukje normalisatie:

Items
itemID | itemDesc

Media
mediumID | mediumDesc

Senders
senderID | senderDesc

Targets
targetID | targetDesc

Batches
batchID | itemID | mediumID | senderID | targetID

Zo kun je in de koppeltabel heel makkelijk alle rijen selecteren die voldoen aan een bepaald type item, sender of target en vervolgens uit de respectievelijke tabellen de gegevens ophalen die daarbij horen.

[ Voor 3% gewijzigd door Crayne op 04-01-2008 09:51 ]

Mijn Library Thing catalogus


  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 18-11 20:51
Dan moet ik echt alles om gaan gooien. Daar gaat wel heel veel tijd in zitten dan...

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 20-11 13:35
Kyoshi schreef op woensdag 02 januari 2008 @ 16:27:
Alleen zit ik nu met het probleem dat items en product in 3 tabellen voorkomen en alledrie naar hetzelfde wijzen, hoe krijg ik de query dan zover dat ik niet meer dan het totale aantal items (ongeveer 2400 -> en dus producten) terug krijg?
Als mijn MSSQL me niet in de steek laat en ik de situatie goed begrijp:
SQL:
1
GROUP BY `items`.`item`


Maar als jij slechts N items hebt en N + x records terugkrijgt is dat perfect normaal gedrag als er meerdere targets / senders per item kunnen zijn (wat je ook omschrijft). Ze grouperen levert je dan precies het aantal items op, maar niet alle informatie :)

[ Site ] [ twitch ] [ jijbuis ]


  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 18-11 20:51
Ik kom er nog steeds niet uit.

Ik gebruik nu om te testen
SQL:
1
SELECT items.product, targets.target, senders.sender FROM items, targets, senders GROUP BY product


code:
1
Ambiguous column name 'product'.


Tot zover klinkt het logisch.

SQL:
1
SELECT items.product, targets.target, senders.sender FROM items, targets, senders GROUP BY items.product


code:
1
Column 'targets.target' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.


het zegt me helemaal niets...

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Je kunt alleen velden in de select query opnemen welke ook in de 'group by' zijn opgenomen, tenzij het verzamelfuncties zijn zoals max(lastdate).

Aan deze thread te zien, denk ik dat het verstandiger is dat je een SQL boek koopt. Dit is eigenlijk allemaal basis SQL kennis.

If it isn't broken, fix it until it is..


  • MuddyMagical
  • Registratie: Januari 2001
  • Laatst online: 20-11 19:35
Even voor mijn beeldvorming:
items
Product | item | medium

senders
Product | item | sender

targets
Product | item | target
Is Product in de verschillende tabellen je Primary Key?
Zo ja, dan gaat er iets goed mis, want dan kan je niet meerdere keren je product invoeren.

Wat ik bedoel te zeggen is dat door je database ontwerp je problemen hebt met het selecteren en invoeren van gegevens via SQL.
Daarnaast heb ik ook het vermoeden dat je kennis van SQL en Normalisatie niet voldoende is voor dit soort dingen.
Teken eens een database ontwerp en ga hier eens rustig naar zitten kijken. Kan je ergens velden combineren zodat je gegevens niet dubbel hebt, etc.
Tip: Normaliseren

  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 18-11 20:51
Ik heb dit ontwerp ook niet gemaakt, dat is het nou net. Ik zal eens kijken naar Normalisatie. Ik wil alleen niet teveel werk aan m'n broek halen door alles om te gaan zetten. Er staan immers al behoorlijk wat gegevens in.
Pagina: 1