MYSQL verwijzing (Prim en For key)

Status
Niet open voor verdere reacties.

klaasm4n

Gebruiker
Lid geworden
1 jan 2011
Berichten
64
Ik heb de volgende tabellen

album
Bestelitem
bestelling
klant

Nu doe ik de volgende code:

Code:
SELECT bestellingnr, klantnr, datum FROM bestelling INNER JOIN klant ON bestellingnr = klantnr;

Voor de duidelijkheid:
bestelling heeft de velden:

bestellingnr, klantnr en datum.

Klant heeft:
klantr, naam etc.

Nu is de bedoeling dat ik ervoor moet zorgen dat de velden worden weergeven zodat ik kan zien wie welke bestelling heeft geplaatst... Het werkt niet? Ik weet zeker dat ik iets fouts doe misschien in de syntaxis?
 
Er zijn twee tabellen die allebei een veld hebben dat "klantnr" heet. Daardoor weet SQL niet goed hoe hij de koppeling moet leggen. (Hij weet niet welke van de twee klantnr je bedoelt)

Daarnaast betwijfel ik dat je een nuttige koppeling kunt maken als je bestellingnr aan klantnr koppelt, gezien die twee niks met elkaar te maken hebben.

Probeer dit:
[sql]SELECT bestellingnr, bestelling.klantnr, datum FROM bestelling INNER JOIN klant ON bestelling.klantnr = klant.klantnr;[/sql]

Door de tabelnaam te gebruiken weet SQL welk klantnr veld je bedoelt op elke plek en deze koppeling ziet er een stuk logischer uit :)
 
Er zijn twee tabellen die allebei een veld hebben dat "klantnr" heet. Daardoor weet SQL niet goed hoe hij de koppeling moet leggen. (Hij weet niet welke van de twee klantnr je bedoelt)

Daarnaast betwijfel ik dat je een nuttige koppeling kunt maken als je bestellingnr aan klantnr koppelt, gezien die twee niks met elkaar te maken hebben.

Probeer dit:
[sql]SELECT bestellingnr, bestelling.klantnr, datum FROM bestelling INNER JOIN klant ON bestelling.klantnr = klant.klantnr;[/sql]

Door de tabelnaam te gebruiken weet SQL welk klantnr veld je bedoelt op elke plek en deze koppeling ziet er een stuk logischer uit :)
Ik zat een beetje te sleutelen en het was me gelukt. Klopt helemaal. Dat was het probleem :p

Nu heb ik een andere probleem of vraag?

Bijvoorbeeld als ik in de Query het volgend heb:

SET @tekst = "
De database administrator (DBA) is verantwoordelijk voor het ontwerpen, impementatie en onderhoud van de database binnen een organisatie. De rol van de DBA is het monitoren en verbeteren van de database performance en veiligheid."

Dan heb ik 4 vragen:
1. De substring DBA moet vervangen worden door dba.

...Oke, de syntaxis is
Code:
SELECT_LOWER ('DBA');

Ik heb dat gewoon geprobeerd en het lukt, maar hoe kan ik ervoor zorgen dat ik de tekst als voorbeeld kan zien? Is het dan mogelijk om het daarin te wijzigen of moet je gewoon eronder de nieuwe code invoeren, dus:

Code:
SET @tekst = "
De database administrator (DBA) is verantwoordelijk voor het ontwerpen, impementatie en onderhoud van de database binnen een organisatie. De rol van de DBA is het monitoren en verbeteren van de database performance en veiligheid."

SELECT_LOWER ('DBA');

Vraag 2 was: Geef de lengte van de hele tekst.
Ik heb het zo gedaan:

SELECT
Code:
CHAR_LENGTH ("De database administrator (DBA) is verantwoordelijk voor het ontwerpen, impementatie en onderhoud van de database binnen een organisatie. De rol van de DBA is het monitoren en verbeteren van de database performance en veiligheid.");

Dit werkt natuurlijk wel, maar dan is weer mijn vraag.. moet ik dit dan gewoon weer eronder plaatsen? Zo dus (of is er een ander manier dat ik de functie in de tekst moet implementeren..?):


Code:
SET @tekst = "
De database administrator (DBA) is verantwoordelijk voor het ontwerpen, impementatie en onderhoud van de database binnen een organisatie. De rol van de DBA is het monitoren en verbeteren van de database performance en veiligheid."

SELECT_LOWER ('DBA');

SELECT CHAR_LENGTH ("De database administrator (DBA) is verantwoordelijk voor het ontwerpen, impementatie en onderhoud van de database binnen een organisatie. De rol van de DBA is het monitoren en verbeteren van de database performance en veiligheid.");

3. Wat was de syntaxis om het aantal keer dat een woord in de tekst voorkomt te weergeven?

4. Ik moet aan het einde van de tekst het woord "EINDE" toevoegen... deze begrijp ik niet? Moet ik gewoon de tekst wijzigen en dan EINDE invullen of moet ik een soort van een syntaxis dat het doet invullen...?

Graag hulp, alvast merci!
 
Dat zijn volgensmij allemaal huiswerkvragen :P Daar kan ik je niet echt mee helpen, ik weet niet precies wat er verwacht wordt.

Ik denk dat je op de goede weg bent maar wat je exact moet doen durf ik niet te zeggen.
 
@Frats, Nou ja! :(

Haha, nou kun je me dan met het volgende helpen:

- SET @tekst???? Wat houdt dat in?
- Is het mogelijk dat ik syntaxix kan gebruiken die uithaalt van @tekst? Dus bijvoorbeeld de codes die ik heb geschreven ipv dat ik alles opnieuw schrijf, gewoon zeg van doe dit en dat FROM @tekst ofzo..?
- Ik heb echt gezocht hoe je de woorden moet tellen, welke code..? Weet het echt niet?
 
Laatst bewerkt:
De @ syntax is volgensmij voor stored procedures, maar daar heb ik nog nooit gebruik van gemaakt dus daar weet ik net zo weinig van af als jij vrees ik :(

Woorden tellen kun je doen met trucjes zoals de lengte van de zin meten en dan de lengte van de zin zonder spaties meten, op deze manier:
SUM( LENGTH(name) - LENGTH(REPLACE(name, ' ', ''))+1)

Maar of dat nou echt super betrouwbaar is weet ik niet. Ik ken zo iig geen functie ervoor, hoewel die misschien wel bestaat :)
 
@ syntax kun je gebruiken om variabelen te definiëren. Deze kun je dan later weer gebruiken in een volgend statement, bijvoorbeeld zo:

[sql]mysql> SET @tekst = 'klaasm4n';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT 'test' FROM dual WHERE 'Frats' = @tekst;
Empty set (0.00 sec)

mysql> SELECT 'test' FROM dual WHERE 'klaasm4n' = @tekst;
+------+
| test |
+------+
| test |
+------+
1 row in set (0.00 sec)[/sql]

Voor het tellen van het aantal woorden vind ik de suggestie van Frats wel een goede, ik ken er ook geen standaard functie voor.
 
@Epic, dank je wel.

Ik heb de volgende code:

SELECT SUM(LENGTH('database is echt cuwl jonga. database is rocken.') - REPLACE('database', '', ''))+1)

Maar het werkt niet...?

Als je het niet erg vind.. zou je dan nog een keer de @syntaxis voor me kunnen uitleggen?

Stel ik heb SET @tekst = "Een heleboel tekst GROOT en klein."

Ik wil nu bijvoorbeeld het woord "GROOT" klein maken met:

SELECT LOWER("GROOT")
of kan ik SELECT LOWER("Groot", van variabele tekst ofzo..?)

Andere vraagje: Als ik een SET @tekst maak, dan zie ik het nergens verschijnen.. de tekst dus. Geeft wel aan dat de Query met succes is gemaakt..?

Merci iedereen!

En laatste vraag: Hoe kan ik een woord (met een syntaxis) aan het einde van de tekst toevoegen...
 
Kijk eens.. lukt niet?

Code:
SELECT SUM(LENGTH('De database administrator is verantwoordelijk voor het ontwerpen, implementatie en onderhoud van de databases binnen een organisatie. De rol van de DBA is het monitoren en verbeteren van de database performance en veiligheid.') - REPLACE('database', '', ''))+1)
 
Heren (en dames)

Ben erachter gekomen dat wanneer je een SET @tekst = "waarde" gebruikt (dat een variabele is) en je kunt deze variabele zien door SELECT @tekst te gebruiken!

Voor de mensen die het misschien nog niet wisten als ik (en voor de toekomstige Googleraars) :D
 
Ander vraag!

Nu wil ik dus SELECT LOWER gebruiken om een woord uit de @tekst te halen..

SET @tekst = "De database administrator (DBA)
is verantwoordelijk voor het ontwerpen, implementatie en onderhoud van de databases
binnen een organisatie. De rol van de DBA is het monitoren en verbeteren van de database
performance en veiligheid.";

SELECT @tekst;

SELECT LOWER('DBA', @tekst)

werkt niet echt of de syntaxen zijn zeker fout..
 
Ik zie 3 vragen, wellicht heb ik er nog één gemist, stel die dan gewoon nog een keer. :p

woorden vervangen

Het commando lower kun je gebruiken wanneer je de complete tekst naar lowercase wilt zetten, niet een gedeelte. Gebruik replace om een gedeelte van de tekst te vervangen:

[sql]mysql> SET @tekst = "DBA, DBa, Dba, dba";
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @tekst;
+--------------------+
| @tekst |
+--------------------+
| DBA, DBa, Dba, dba |
+--------------------+
1 row in set (0.00 sec)

mysql> SELECT REPLACE(@tekst,'DBA','dba');
+-----------------------------+
| REPLACE(@tekst,'DBA','dba') |
+-----------------------------+
| dba, DBa, Dba, dba |
+-----------------------------+
1 row in set (0.00 sec)[/sql]

tekst aan elkaar plakken

Tekst aan elkaar plakken kan met concat:

[sql]mysql> SET @tekst = "klaasm4n";
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @tekst;
+----------+
| @tekst |
+----------+
| klaasm4n |
+----------+
1 row in set (0.00 sec)

mysql> SELECT CONCAT(@tekst,' for president!');
+----------------------------------+
| CONCAT(@tekst,' for president!') |
+----------------------------------+
| klaasm4n for president! |
+----------------------------------+
1 row in set (0.00 sec)[/sql]

woorden tellen

Alle woorden tellen kan via de suggestie van Frats. Een specifiek woord tellen in een zin kan niet zomaar. Eventueel zou je daar zelf een functie voor kunnen maken, maar dat is wel even gepuzzel.
 
@Epic

DANK voor de uitgebreide uitleg! Nee je hebt me goed geholpen merci :P

Nu nog een vraagje, want de suggestie van Frats (@Frats, ook merci!) is goed. Alleen werkt die niet bij mij of ik doe het verkeerd. Hoe kan ik ervoor zorgen dat het werkt in deze tekst;?

SET @tekst = "De database administrator (DBA)
is verantwoordelijk voor het ontwerpen, implementatie en onderhoud van de databases
binnen een organisatie. De rol van de DBA is het monitoren en verbeteren van de database
performance en veiligheid.";


want dit werkt niet:

SUM( LENGTH(database) - LENGTH(REPLACE(database, ' ', ''))+1)

Ik denk dat ik ervoor moet zorgen om op een of ander manier deze code in de tekst te krijgen.. of ernaar laten verwijzen, maar hoe :P

Merci everyone, heb echt veel aan jullie. Ik hoop dat jullie later ook wat aan mij kunnen hebben!
 
@Epic, another question :p

Als ik nu de @tekst variabel heb gemaakt en die wil ik zien met se SELECT @tekst..

dan zie ik niet de gehele tekst...?
 
Bij mij werkt het wel dus ik kan niet zeggen waarom het bij jou niet werkt. Gebruik ze soms een speciale tool hiervoor? Op de commandline zie ik dit:

[sql]mysql> SET @tekst = "De database administrator (DBA)
"> is verantwoordelijk voor het ontwerpen, implementatie en onderhoud van de databases
"> binnen een organisatie. De rol van de DBA is het monitoren en verbeteren van de database
"> performance en veiligheid.";
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @tekst;
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| @tekst |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| De database administrator (DBA)
is verantwoordelijk voor het ontwerpen, implementatie en onderhoud van de databases
binnen een organisatie. De rol van de DBA is het monitoren en verbeteren van de database
performance en veiligheid. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)[/sql]

De suggestie van Frats was bedoeld om het totaal aantal woorden in de string te tellen, niet om een specifiek woord. Om het aantal voorkomens te zoeken van het woord 'database' kun je dit trucje gebruiken.

[sql]mysql> SELECT ROUND( ( LENGTH( @tekst ) - LENGTH( REPLACE( @tekst, 'database' , '' ) ) ) / LENGTH( 'database' ) ) aantal;
+--------+
| aantal |
+--------+
| 3 |
+--------+
1 row in set (0.00 sec)[/sql]

Dit is wat er gebeurd:
1. Totale lengte tellen van de string
2. Totale lengte van de string zonder het te zoeken woord
3. Lengte van het te zoeken woord
4. sommetje wordt dan ( 1 - 2 ) / 3 = het aantal voorkomens van het woord 'database'
 
BESTE BESTE BESTE EPIC, het is gelukt! Jeetje, wat geeft het je een goed gevoel als je het voor mekaar hebt. Dank je wel voor alles!

Vooral het verwijzen naar de @tekst heb ik nu onder de knie. Ik zal even snel door gaan met mijn laatste hoofdstuk en eindopdracht. Ik zal hier wel vragen stellen als je het niet erg vind! Dank je! :D
 
@Epic, wat dom van mij. Echt lachen joh. De eerste twee volgende zinnen in het boek stond dat ik de // delimiter moest gebruiken of welke ik wou en ik maar denken waarom werkt het niet. Volgende keer zal ik verder kijken dan mijn neus lang is. lol
 
Ik zie niets wanneer ik dit toevoeg:

SHOW CREATE PROCEDURE proc_watismaxprijs;

Het zou mijn procedure moeten tonen. Echter zie ik niets? Het zegt wel dat de query succesvol is uitgevoerd...?
 
Nu heb ik het volgende gemaakt. Een procedure en een SHOW, maar ik kan die niet zien zoals op het voorbeeld.. wat doe ik fout :(


CREATE PROCEDURE proc_setvoorraad(IN code INT)
BEGIN
CASE code
WHEN 0 THEN UPDATE boeken SET `´voorraad´`= 0;
WHEN 1 THEN UPDATE boeken SET `´voorraad´`= 100;
WHEN 2 THEN UPDATE boeken SET `´voorraad´`= 200;
ELSE UPDATE boeken SET `´voorraad´`= 300;
END case;
END;
//

SET @code = 0;
call proc_setvoorraad(@code);
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan