[MySQL] Deel van varchar
Ik ben bezig met een linkpartner script, en daarbij wil ik het zo hebben dat je meerdere plaatsen op kan geven, voor bijvoorbeeld meerdere sites.
Ik dacht dat ik wel gewoon een varchar kon maken met daarin de plaatsen, gescheiden door een komma (,). Een plaats is gewoon een digit.
Voorbeeld:
1,4,6 //dit staat in de varchar
Hier moet de link dus op plaats 1, 4 en 6 komen te staan.
Nu het probleem:
Bij het ophalen van de links zit het lastige. Ik wil bijvoorbeeld alle links die plaats 4 hebben ophalen. Ik moet dus zoeken welke rijen in de mysql tabel een plaats varchar met het getal 4 er in hebben.
Quote:
SELECT * FROM linkpartners WHERE plaats=4
Dat zou in de query komen te staan, maar omdat de plaats waarde in de varchar niet puur 4 is, maar omdat er meerdere dingen om heen staan, kan hij dat niet vinden.
Hoe zorg ik er voor dat hij het wel kan vinden? Of is er misschien een andere manier om de plaatsen op te slaan?
Gewijzigd op 01/01/1970 01:00:00 door Kay Kay
Jouw manier is niet de juiste manier.
Dit is mijn tabelletje:
Quote:
CREATE TABLE `linkpartners` (
`id` int(4) NOT NULL auto_increment,
`hitsout` int(5) NOT NULL,
`hitsin` int(5) NOT NULL,
`naam` varchar(255) NOT NULL,
`link` text NOT NULL,
`added` datetime NOT NULL,
`plaats` varchar(50) NOT NULL default '1',
PRIMARY KEY (`id`)
)
`id` int(4) NOT NULL auto_increment,
`hitsout` int(5) NOT NULL,
`hitsin` int(5) NOT NULL,
`naam` varchar(255) NOT NULL,
`link` text NOT NULL,
`added` datetime NOT NULL,
`plaats` varchar(50) NOT NULL default '1',
PRIMARY KEY (`id`)
)
Ik schenk eigenlijk nooit zo veel aandacht aan hoe ik het indeel..
Zou je wel moeten doen. Bespaart je een hoop trammelant. Je moet het allemaal zo flexibel mogelijk houden, dat je tussentijds ook nog veranderingen kunt toepassen i.p.v. je hele datamodel weer om te moeten gooien.
Eigenlijk heb je twee dingen: Links, en plekjes. Een link kan op meerdere plekjes staan, maar er kan maar één link op een plekje tegelijkertijd staan.
link -> plekje,plekje,plekje
plekje -> link.
Tada! Een echte één-op-meer relatie :) En dan heb je geen koppeltabel nodig. Ik zou zeggen: twee tabellen:
Links:
- id
- hits_in
- hits_out
- naam
- link
- added
Plaatsen:
- id
- link_id
Een lijst met alle ingevulde plaatsen kan dan als volgend:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
links.*,
plaats.id as plaats_id
FROM
plaatsen
LEFT JOIN links ON
links.id = plaatsen.link_id
ORDER BY
plaatsen.id
links.*,
plaats.id as plaats_id
FROM
plaatsen
LEFT JOIN links ON
links.id = plaatsen.link_id
ORDER BY
plaatsen.id
en een link op een bepaalde plaats ophalen:
Zo zou het kunnen, maar is het niet veel handiger om 1 tabel te gebruiken?
Ik heb nog nooit meerdere tabellen gebruikt voor een script. Met JOIN heb ik dus ook nooit gewerkt.
Zou dit dan echt de enige manier zijn om te doen wat ik wil?
dan kan je een unique op beide kolommen zetten zodat er nooit 2 x dezelfde rij in kan zitten (een link kan niet 2 x op 1 plekje staan lijkt mij).
@Hate: ja het is een stuk beter om zo te werken, omdat dit al je probleem oplost. Wen er maar aan dat je met meer dan 1 tabel gaat werken, ik heb wel eens gehad dat ik met 1 query ong. 8 tabellen aanspreek.
Gewijzigd op 01/01/1970 01:00:00 door Terence Hersbach
als het aantal plekken waar de links in komen te staan bijvoorbeeld 5 is
$aantalplekken = 5;
while($i=1; $i=$aantalplekken; $i++){
$sql = "SELECT * FROM linkpartners WHERE plaats='$i'";
$result = mysql_query($sql) or die (mysql_error());
$print("<u>Kolom $i</u><br />");
while($row=mysql_fetch_array($result)){
/* hier alles ophalen wat je wilt hebben bij
$link = $row['link'];
print ("$link<br />");
*/
};
print("<br />");
};
Gewijzigd op 01/01/1970 01:00:00 door > Dice
Met je WHERE kan je ook dit doen:
Dan heb je echt maar 1 query nodig en werkt het net zo makkelijk (en sneller!!!)
In de 2e tabel, wat moet ik daar precies inzetten? Ik heb nu 2 kolommen: id en link_id, zoals Jelmer zei.
Wat moet ik in link_id zetten dan?
Ik heb nu dus 1 tabel met de links:
| id | Naam | Link | Hits OUT | Hits IN | Toegevoegd
| 2 | Google | http://google.nl | 4 | 23 | 17-01-2009
| 1 | Testlink | http://google.com | 1 | 11 | 15-01-2009
| 3 | Tweakers.net | http://tweakers.net | 1 | 0 | 18-01-2009
Maar hoe ziet de andere er uit?
Gewijzigd op 01/01/1970 01:00:00 door Kay Kay
Het invoegen doe ik nu zo, waarbij de kolom plaats in linkpartners alleen visueel is (zodat je de plaatsen op deze manier ziet: 1,3,4)
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
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
<?php
$plaats = $_POST['plaats'];
if(mysql_query("INSERT INTO linkpartners (naam, link, added, plaats) VALUES ('$naam','$link','$datumadd','$plaats')"))
{
$link_id = mysql_insert_id();
$waarden = "";
$aantal_plaatsen = count($plaats_array);
$i = 1;
foreach($plaats_array as $plaats)
{
if($i == $aantal_plaatsen)
{
$waarden .= "('$plaats','$link_id')";
}else{
$waarden .= "('$plaats','$link_id'), ";
}
$i++;
}
if(mysql_query("INSERT INTO linkpartners_plaatsen (plaats, link_id) VALUES $waarden"))
{
$bericht .= $naam." is succesvol toegevoegd aan het systeem!<br />";
}else{
$error .= "Er is wat fout gegaan bij het toevoegen!<br />";
}
}else{
$error .= "Er is wat fout gegaan bij het toevoegen!<br />";
}
?>
$plaats = $_POST['plaats'];
if(mysql_query("INSERT INTO linkpartners (naam, link, added, plaats) VALUES ('$naam','$link','$datumadd','$plaats')"))
{
$link_id = mysql_insert_id();
$waarden = "";
$aantal_plaatsen = count($plaats_array);
$i = 1;
foreach($plaats_array as $plaats)
{
if($i == $aantal_plaatsen)
{
$waarden .= "('$plaats','$link_id')";
}else{
$waarden .= "('$plaats','$link_id'), ";
}
$i++;
}
if(mysql_query("INSERT INTO linkpartners_plaatsen (plaats, link_id) VALUES $waarden"))
{
$bericht .= $naam." is succesvol toegevoegd aan het systeem!<br />";
}else{
$error .= "Er is wat fout gegaan bij het toevoegen!<br />";
}
}else{
$error .= "Er is wat fout gegaan bij het toevoegen!<br />";
}
?>
Wat vinden jullie hier van? Zoals gezegt, ik heb nog nooit met JOIN gewerkt. Kan dit makkelijker? En hoe kan ik dan makkelijk updaten? Want ik wil natuurlijk ook wel eens een linkje van een plaats weghalen
Gewijzigd op 01/01/1970 01:00:00 door Kay Kay
Kick
Maar hoe kan ik updaten met die JOIN? Met mijn huidige kennis zal ik het zelfde doen zoals ik het nu toevoeg, maar dat ik eerst alle waarden verwijder.
Kick 3 ..