Multiple INSERT/UPDATe query
Dit betreft en top40 systeem. Ik heb daar een nieuw overzicht voor gemaakt met behulp van SQL Designer en daar heb ik nu enkele vragen over. Het uit gewerkte overzicht van de tabellen en velden vinden jullie onder aan.
Ik moet hier nu dus een INSERT, UPDATE en DELETE query voor maken. Maar hier heb ik al even op Google voor rond gesnuffeld maar ben nog weinig goede uitleggen tegen gekomen. Ik vraag me daarom ook af aan jullie hoe jullie deze query's zullen gaan oplossen?
Maar waar ik ook nog niet uitkom in het denk proces is het volgende.
Stel ik doe een nieuwe week INSERT nu is de kans heel erg groot dat er een deel van de artiesten en titels al in een vorige week is voor gekomen. Nu is het dus de bedoeling dat die rows niet extra worden aangemaakt. Hoe moet ik dit samen met z'n INSERT query oplossen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
CREATE TABLE `top40_titels` (
`titel_id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
`artiest_id` INTEGER NULL DEFAULT NULL,
`titel_naam (150)` VARCHAR(150) NULL DEFAULT NULL,
`p_date` DATETIME NULL DEFAULT NULL,
`u_date` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`titel_id`, `artiest_id`)
);
CREATE TABLE `top40` (
`top40_id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
`week` INTEGER NULL DEFAULT NULL,
`jaar` INTEGER NULL DEFAULT NULL,
`positie_h` INTEGER NULL DEFAULT NULL,
`titel_id` INTEGER NULL DEFAULT NULL,
`p_date` DATETIME NULL DEFAULT NULL,
`u_date` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`top40_id`, `week`, `jaar`, `positie_h`)
);
CREATE TABLE `top40_artiesten` (
`artiest_id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
`artiest_naam (125)` VARCHAR(125) NULL DEFAULT NULL,
`p_date` DATETIME NULL DEFAULT NULL,
`u_date` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`artiest_id`)
);
ALTER TABLE `top40_titels` ADD FOREIGN KEY (artiest_id) REFERENCES `top40_artiesten` (`artiest_id`);
ALTER TABLE `top40` ADD FOREIGN KEY (titel_id) REFERENCES `top40_titels` (`titel_id`) ON DELETE CASCADE;
ALTER TABLE `top40` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `top40_titels` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `top40_artiesten` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
`titel_id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
`artiest_id` INTEGER NULL DEFAULT NULL,
`titel_naam (150)` VARCHAR(150) NULL DEFAULT NULL,
`p_date` DATETIME NULL DEFAULT NULL,
`u_date` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`titel_id`, `artiest_id`)
);
CREATE TABLE `top40` (
`top40_id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
`week` INTEGER NULL DEFAULT NULL,
`jaar` INTEGER NULL DEFAULT NULL,
`positie_h` INTEGER NULL DEFAULT NULL,
`titel_id` INTEGER NULL DEFAULT NULL,
`p_date` DATETIME NULL DEFAULT NULL,
`u_date` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`top40_id`, `week`, `jaar`, `positie_h`)
);
CREATE TABLE `top40_artiesten` (
`artiest_id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
`artiest_naam (125)` VARCHAR(125) NULL DEFAULT NULL,
`p_date` DATETIME NULL DEFAULT NULL,
`u_date` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`artiest_id`)
);
ALTER TABLE `top40_titels` ADD FOREIGN KEY (artiest_id) REFERENCES `top40_artiesten` (`artiest_id`);
ALTER TABLE `top40` ADD FOREIGN KEY (titel_id) REFERENCES `top40_titels` (`titel_id`) ON DELETE CASCADE;
ALTER TABLE `top40` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `top40_titels` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `top40_artiesten` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Gewijzigd op 15/09/2012 02:42:33 door Remco schrubben
Het lijkt mij namelijk logisch dat je een tabel maakt voor artiesten, één waarin je de nummers in zet, één waarin je de top 40 (weeknummer enzo) en één waarin je de nummers die in de top 40 staan zet.
Mijn tabel top40:
- weeknr INT(4)
- jaar INT(6)
- positie_h int(4)
- titel_id INT(11)
PK op weeknr,jaar,positie_h
Zou je misschien mij ook nog een stuk de goede weg kunnen laten instaal ivm mijn vraag?
Ik denk dat je meer naar de invoer kant (HTML/PHP) moet kijken, en dan op basis van de lijst van de week ervoor de nieuwe lijst samenstellen/bewerken.
ik wil namelijk dit systeem gelijk goed overnieuw bouwen en ben dus opzoek na goede uitleggen er over hoe ik het beste kan aanpakken.
Want een INSERT in 2 tabellen heb ik voorheen altijd met een TRANSACTION gedaan. Dus over meerdere is voor mij een raadsel.
Mijn bedoeling is het volgende in stappen. Deze stappen zijn noodzakelijk vanwege geen toestemming om het te copieeren van de orginele lijst van top40.nl.
- De aller eerste week word volledig met de hand ingevoerd, laat zeggen dat week 35 de eerste week wordt in het systeem. Dus in totaal 40 rows.
- Nieuwe week is aangebroken (Week 36). Op top40_toevoeg.php haal ik de complete lijst op van week 35 op.
- De lijst loop ik na welke positie's er verandert zijn en welke artiesten en/of titels nieuw in lijst staan. Deze manier van werken is heel makkelijk en de nieuwe lijst is binnen 10 min gemaakt.
- Als ik de nieuwe lijst na heb gelopen word het INSERT gedaan richting de database.
- De rows die reeds bestaan word alleen de id gebruikt. Voor de artiest en/of titel die nieuw zijn word er nieuwe row gemaakt.
Kleine voorbeeld:
+-----------------------------------------------+
| Week 35 |
+-------------+----------------+------+---------+
| Artiest | Titel | Week | Positie |
+-------------+----------------+------+---------+
| Jannes | Ga dan | 35 | 1 |
+-------------+----------------+------+---------+
| Andre Hazes | De vlieger | 35 | 2 |
+-------------+----------------+------+---------+
|Koos Alberts | Verscheurde je | 35 | 3 |
+-------------+----------------+------+---------+
+-----------------------------------------------+
| Week 36 |
+-------------+----------------+------+---------+
| Artiest | Titel | Week | Positie |
+-------------+----------------+------+---------+
| Andre Hazes | De vlieger | 36 | 1 |
+-------------+----------------+------+---------+
| Jannes | Ga dan | 36 | 2 |
+-------------+----------------+------+---------+
| Grad Damen | Ga mee opstap | 36 | 3 |
+-------------+----------------+------+---------+
Zoals we zien heb ik hier even 2 weken als voorbeeld genomen.
Maar week 35 is ten opzichte van 36 helemaal anders, maar er zijn wel 2 titels en artiesten die zelfde zijn. Nu vroeg ik mij dus erg af hoe ik dit moet gaan aanpakken. Want ik snap even niet hoe dat in zijn werk moet gaan in eerder genomede database model. Wat ik wel snap is het volgende: tabellen top40_artiesten en top40_titels zullen na 2 weken elke 3 rows hebben en table top40 zal er dan 6 moeten hebben. Begrijp ik deze goed of?
Zou graag daar eens wat uitleg over verkrijgen?
Gewijzigd op 15/09/2012 16:40:58 door remco schrubben