Juiste query voor heen en terug
tabel 1
id | naam |
250 | Skatebkard |
345 | skateboard-100x100.png |
table 2
id | postid | value |
203 | 250 | rood |
204 | 250 | 345 |
Ik wil zowel de value als de link van de afbeelding hebben.
Maar beide tabellen hebben iets van deze informatie.
Als ik een query voor Skateboard dan kan ik met een JOIN de value ophalen, maar hoe refereer ik weer terug van tabel 2 naar 1 voor afbeeldingsurl?
Ik wil dus de value rood hebben en skateboard-100x100.png.
De value 345 in tabel 2 is de ID in tabel 1 van de URL
Wie kan mij helpen hiermee?
Ligt je relatie niet tussen Tabel1.id en tabel2.postid?
Maar ik zoek om ook weer terug te kunnen. Laat me dit even duidelijker uitleggen.
Ik filter dan even op skateboard van tabel 1.
Ik refereer met de id (250 )van skateboard naar tabel2, de match is dan in de kolom postid.
Dit zou 2 resultaten opleveren, namelijk id 203 en 204.
203 heeft de value rood en 204 heeft de value 345.
Die 345 is de ID van de afbeeldings URL in tabel1 en die wil ik ook graag hebben.
Als je dat veld meeneemt in je SELECT, dan kan je die ook gebruiken.
Nogmaals dan maar even in het heel kort.
In tabel 1 gebruik je een en hetzelfde veld (naam) voor zowel een productnaam als een afbeeldings-url. Dat klopt niet. Een veld moet altijd dezelfde inhoud hebben. In dit geval kun je bijv. een veld img-url toevoegen waarin dan de url komt te staan in dezelde rij.
Het hele principe klopt toch niet? Of ben ik nu gek? Je kan toch niet in één-en-dezelfde kolom de ene keer een productnaam hebben staan en de andere keer een afbeeldings-url?
Je zou nog tabel2 kunnen voorzien van een extra kolom die aangeeft of het een eigenschap (kleur) is, of dat het om een afbeelding (of review of weet ik wat) gaat.
En dan zou tabel1 "entiteiten" bevatting. Dingen dus. Dus het ding "product" of het ding "afbeelding"
Logischer zou ik vinden, om in tabel2 onder "value" de afbeelding te noemen (foto.jpg) en ook dat extra veld dat aangeeft dat het om een kleur, foto, afmeting of maat gaat.
Want wat nu als er een 2e foto bij komt. Of een review, of een beschrijving. Die kunnen allemaal als "entiteit" opgeslagen worden. Maar dan gaat "is numeriek" ook niet meer helpen.
Je krijgt dan zo'n oplossing. Mooi is anders, maar er is beeld.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
$db = new mysqli ('localhost', 'user', 'password', 'database' );
$query = "SELECT * FROM tabel1 t1
JOIN tabel2 t2
ON t1.id = t2.postid
WHERE t2.value REGEXP '^[^0-9]+$';";
$result = $db->query( $query );
while ( $row = $result->fetch_object() )
{
echo '<pre>' . print_r( $row, TRUE ) . '</pre>';
$product = $row;
}
echo '<pre>' . print_r( $product, TRUE ) . '</pre>';
$query = "SELECT * FROM tabel1 t1
JOIN tabel2 t2
ON t1.id = t2.value
WHERE t2.value REGEXP '^[0-9]+$';";
$result = $db->query( $query );
while ( $row = $result->fetch_object() )
{
echo '<pre>' . print_r( $row, TRUE ) . '</pre>';
$product->afbeelding = $row->naam;
}
echo '<pre>' . print_r( $product, TRUE ) . '</pre>';
echo '<table border="1">';
$keys = array_keys( (array)$product );
echo '<tr>';
for ( $i = 0; $i < count($keys); $i++ )
{
echo '<th>' . $keys[$i] . '</th>';
}
echo '</tr>' . PHP_EOL . '<tr>';
foreach ( $product as $key => $value )
{
echo '<td>' . $value . '</td>';
}
echo '</tr>';
echo '</table>';
?>
$db = new mysqli ('localhost', 'user', 'password', 'database' );
$query = "SELECT * FROM tabel1 t1
JOIN tabel2 t2
ON t1.id = t2.postid
WHERE t2.value REGEXP '^[^0-9]+$';";
$result = $db->query( $query );
while ( $row = $result->fetch_object() )
{
echo '<pre>' . print_r( $row, TRUE ) . '</pre>';
$product = $row;
}
echo '<pre>' . print_r( $product, TRUE ) . '</pre>';
$query = "SELECT * FROM tabel1 t1
JOIN tabel2 t2
ON t1.id = t2.value
WHERE t2.value REGEXP '^[0-9]+$';";
$result = $db->query( $query );
while ( $row = $result->fetch_object() )
{
echo '<pre>' . print_r( $row, TRUE ) . '</pre>';
$product->afbeelding = $row->naam;
}
echo '<pre>' . print_r( $product, TRUE ) . '</pre>';
echo '<table border="1">';
$keys = array_keys( (array)$product );
echo '<tr>';
for ( $i = 0; $i < count($keys); $i++ )
{
echo '<th>' . $keys[$i] . '</th>';
}
echo '</tr>' . PHP_EOL . '<tr>';
foreach ( $product as $key => $value )
{
echo '<td>' . $value . '</td>';
}
echo '</tr>';
echo '</table>';
?>
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT t1.naam, t2.value AS kleur, t1F.naam AS foto
FROM tabel1 t1
JOIN tabel2 t2 on t2.postid = t1.id AND NOT t2.value REGEXP '^[^0-9]+$'
JOIN tabel2 t2F on t2F.postid = t1.id AND t2F.value REGEXP '^[^0-9]+$'
JOIN tabel1 t1F on t1F.id = t2F.value
WHERE tabel1.id = 250
FROM tabel1 t1
JOIN tabel2 t2 on t2.postid = t1.id AND NOT t2.value REGEXP '^[^0-9]+$'
JOIN tabel2 t2F on t2F.postid = t1.id AND t2F.value REGEXP '^[^0-9]+$'
JOIN tabel1 t1F on t1F.id = t2F.value
WHERE tabel1.id = 250
Dit zou records moeten geven met alle kleuren en foto's (bij 1 foto en 1 kleur maar 1 record)
Blij dat iemand het met me eens is ;)
De huidige set-up is vragen om problemen.
Zoiets als dit lijkt me handiger:
tabel 1: products
id | name |
250 | Skateboard |
251 | Fiets |
table 2: product_properties
id | product_id | type | value |
203 | 250 | color | rood |
204 | 250 | image | skateboard-100x100.png |
205 | 251 | gender | heren |
De wp_metapost bevat de de informatie zoals prijs, voorraad maar heeft ook in de ID van de afbeelding hierin staan die weer refereert aan de wp_posts tabel.
Beide hebben dus informatie die ik dus van 2 kanten moet laten werken.
Misschien is onderstaand tabellen overzicht duidelijker
id | post_title | guid | post_type |
45 | skateboard | skatebord-rood | product |
46 | fiets | fiets-wit | product |
65 | skateboard-afb | skateboard-rood.png | image |
66 | fiets-afb | fiets-wit.png | image |
id[/td | post_id | meta_key | meta_value | [/tr]
85[/td | 45 | price | 24.50 | [/tr]
85[/td | 45 | stock | 12 | [/tr]
85[/td | 45 | image | 65 | [/tr]
86[/td | 46 | price | 224.50 | [/tr]
86[/td | 46 | stock | 2 | [/tr]
86[/td | 46 | image | 66 | [/tr]
Gewijzigd op 19/05/2020 13:32:32 door Ben Pastoor
maar je hebt dus zowel in tabel1 (post_type) als in tabel2 (meta_key) een aanduiding dat het om een afbeelding gaat....
Overigens klopt de 2e tabel sowieso niet, want die heeft dubbele dezelfde id's.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
(SELECT t1.id FROM tabel1 t1
WHERE t1.id = 250) AS id,
(SELECT t1.naam FROM tabel1 t1
WHERE t1.id = 250) AS naam,
(SELECT t2.value FROM tabel2 t2
JOIN tabel1 t1
ON t1.id = t2.postid
WHERE t2.value REGEXP '^[^0-9]+$' AND t1.id = 250 ) AS kleur,
(SELECT t1.naam FROM tabel1 t1
JOIN tabel2 t2
ON t1.id = t2.value
WHERE t2.value REGEXP '^[0-9]+$' ) AS afbeelding;
(SELECT t1.id FROM tabel1 t1
WHERE t1.id = 250) AS id,
(SELECT t1.naam FROM tabel1 t1
WHERE t1.id = 250) AS naam,
(SELECT t2.value FROM tabel2 t2
JOIN tabel1 t1
ON t1.id = t2.postid
WHERE t2.value REGEXP '^[^0-9]+$' AND t1.id = 250 ) AS kleur,
(SELECT t1.naam FROM tabel1 t1
JOIN tabel2 t2
ON t1.id = t2.value
WHERE t2.value REGEXP '^[0-9]+$' ) AS afbeelding;
Los hiervan, je werkt met een pakket. Het is handig om meteen te vermelden dat je van WordPress gebruik maakt, zodat de rest van de wereld dit ook direct weet.
Dit pakket heeft heel veel functionaliteit. Ik heb 5 minuten geGoogled, en blijkbaar bestaat er een standaard WordPress functie die dit mogelijk snel voor jou kan oplossen.
Wellicht is de syntax in 10 jaar wat veranderd, maar je zou de volgende aanroep eens kunnen proberen.
Het lijkt mij een goede gewoonte om, voordat je een pakket probeert te hacken, te kijken of datgene wat jij zoekt toevallig out-of-the-box beschikbaar is.
Gewijzigd op 19/05/2020 16:16:41 door Thomas van den Heuvel
Ik zou natuurlijk ook een aparte query voor de afbeelding kunnen maken aangezien ik de value van de andere query in een variable zou kunnen opslaan?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT t1.guid as naam, t2.meta_value AS prijs, t1F.guid AS foto
FROM tabel1 t1
JOIN tabel2 t2 on t2.postid = t1.id AND meta_key = 'price'
JOIN tabel2 t2F on t2F.postid = t1.id AND t2F.meta_key = 'image'
JOIN tabel1 t1F on t1F.id = t2F.value
WHERE tabel1.id = 45
FROM tabel1 t1
JOIN tabel2 t2 on t2.postid = t1.id AND meta_key = 'price'
JOIN tabel2 t2F on t2F.postid = t1.id AND t2F.meta_key = 'image'
JOIN tabel1 t1F on t1F.id = t2F.value
WHERE tabel1.id = 45
Toevoeging op 20/05/2020 08:48:09:
ik zie in de tabel geen kleur, dus ik heb er maar prijs van gemaakt.
edit: meta_value moest een paar keer meta_key zijn.
Gewijzigd op 20/05/2020 08:49:02 door Ivo P
Ik ben even voor je in Wordpress gedoken.
Als je zowel de meta_value welke in de table wp_postmeta staan als de afbeelding die aan deze post is gekoppeld.
Kun je 2 queries maken.
Je krijg tenslotte de thumb id van de tabel wp_postmeta die je in een variabel kan opslaan.
Maar om de meta_value te krijgen heb je eerst de tabel wp_posts nodig.
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
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
<?php
$query = "
SELECT wp_posts.ID, wp_posts.post_title, wp_postmeta.meta_key , wp_postmeta.meta_value
FROM wp_posts
JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
WHERE post_type='product' and post_title='test v'
";
$result = mysqli_query($connection, $query);
?><table><?php
while($row = mysqli_fetch_assoc($result)){
?>
<tr><td><?php echo $row['meta_key']; ?></td><td><?php echo $row['meta_value']; ?></td></tr>
<?php
if($row['meta_key'] == '_thumbnail_id'){
$thumbid = $row['meta_value'];
}
}
$query = "
SELECT guid
FROM wp_posts
WHERE ID=$thumbid
";
$thumbresult = mysqli_query($connection, $query);
while($row = mysqli_fetch_assoc($thumbresult)){
?>
<tr><td>afbeeldingsurl</td><td><?php echo $row['guid']; ?></td>
<?php
}
?></table>
$query = "
SELECT wp_posts.ID, wp_posts.post_title, wp_postmeta.meta_key , wp_postmeta.meta_value
FROM wp_posts
JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
WHERE post_type='product' and post_title='test v'
";
$result = mysqli_query($connection, $query);
?><table><?php
while($row = mysqli_fetch_assoc($result)){
?>
<tr><td><?php echo $row['meta_key']; ?></td><td><?php echo $row['meta_value']; ?></td></tr>
<?php
if($row['meta_key'] == '_thumbnail_id'){
$thumbid = $row['meta_value'];
}
}
$query = "
SELECT guid
FROM wp_posts
WHERE ID=$thumbid
";
$thumbresult = mysqli_query($connection, $query);
while($row = mysqli_fetch_assoc($thumbresult)){
?>
<tr><td>afbeeldingsurl</td><td><?php echo $row['guid']; ?></td>
<?php
}
?></table>
Zelf ben ik nog niet zo thuis in een JUISTE query maken maar dit werk wel.
Wellicht kun je dit ook in een query kwijt?
Gewijzigd op 21/05/2020 15:29:48 door Jop B
Zelfs als dit een standalone script is, dan heeft WP toch wel zoiets voor het laden van enkel de core? wp-load.php ofzo?
Of je maakt van dit standalone script een plugin.
Anyhow, hf met het opnieuw uitvinden van het wiel.