Mysql join loop vraag
Ik kom er even niet meer uit, ik heb 2 tabellen. Eentje heet bedrijf_gegevens en de ander bedrijf_acties.
Online heb ik een mooie sql query gevonden welke via de latitude en longitude bedrijven in de buurt opspport in een bepaalde radius.
Dit werkt perfect maar nu haalt die nu enkel de bedrijven op maar wil ik ook de acties van deze bedrijven kunnen oppikken, hij pakt nu telkens 1 actie ipv alle acties van het bedrijf omdat die eerste query enkel de bedrijven pakt, hoe kan ik ook alle acties ophalen bij de gevonden bedrijven.
De code:
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
// hier komen alle acties.
$url="http://maps.googleapis.com/maps/api/geocode/json?address=".urlencode($plaatsnaam)."";
$json = file_get_contents($url);
$data = json_decode($json, TRUE);
//echo 'latitude: '.$data['results'][0]['geometry']['location']['lat'].'<br/>';
//echo 'longitude: '.$data['results'][0]['geometry']['location']['lng'].'<br/>';
//echo 'Plaats: '.$data['results'][0]['formatted_address'].'<br/>';
// echo '<hr>';
//echo '<h3>Alle restaurants in straal van 25 km.... hemelsbreed dus zonder wegen..</h3>'.'<br/><br/>';
$db = new database(); // Initiate a new MySQL connection
$tableName = "bedrijf_gegevens";
$origLat = $data['results'][0]['geometry']['location']['lat'];
$origLon = $data['results'][0]['geometry']['location']['lng'];
$dist = 25 ; // This is the maximum distance (in miles) away from $origLat, $origLon in which to search
$query = "SELECT *, 6371 * 2 *
ASIN(SQRT( POWER(SIN(($origLat - abs(latitude))*pi()/180/2),2)
+COS($origLat*pi()/180 )*COS(abs(latitude)*pi()/180)
*POWER(SIN(($origLon-longitude)*pi()/180/2),2)))
as distance FROM $tableName WHERE
longitude between ($origLon-$dist/abs(cos(radians($origLat))*69))
and ($origLon+$dist/abs(cos(radians($origLat))*69))
and latitude between ($origLat-($dist/69))
and ($origLat+($dist/69))
having distance < $dist ORDER BY distance limit 100;";
$result = $db->query($query);
while($rows = mysqli_fetch_assoc($result))
{
// Bedrijven in de buurt maar zijn er deals?
$omschrijving = $rows['lange_omschrijving'];
$stringCut = substr($omschrijving , 0, 180);
// Eindigen in een woord.
$omschrijving = substr($stringCut, 0, strrpos($stringCut, ' ')).'...';
echo '<div class="col-md-4">';
echo '<div class="image-box team-member">
<div class="overlay-container">
<img style="width:100%; height:275px;" alt="" src="'.verkrijgBedrijfsHoofdImageByKlantId($rows['klant_id']).'">
<div class="overlay">
<ul class="social-links colored clearfix">
<li class="facebook"><a href="http://www.facebook.com" target="_blank"><i class="fa fa-facebook"></i></a></li>
<li class="twitter"><a href="http://www.twitter.com" target="_blank"><i class="fa fa-twitter"></i></a></li>
<li class="skype"><a href="http://www.skype.com" target="_blank"><i class="fa fa-skype"></i></a></li>
</ul>
</div>
</div>
<div class="image-box-body">
<h3 class="title">'.verkrijgBedrijfsTypeByBedrijfTypeId($rows['type_bedrijf']).' '.$rows['bedrijfsnaam'].' in '.$rows['plaatsnaam'].'</h3>
<small>'.verkrijgActieTitelByBedrijfId($rows['klant_id']).'</small>
<div class="separator-2"></div>
<p>'.verkrijgOmschrijvingByBedrijfId($rows['klant_id']).'</p>
</div>
</div></div>';
}
?>
// hier komen alle acties.
$url="http://maps.googleapis.com/maps/api/geocode/json?address=".urlencode($plaatsnaam)."";
$json = file_get_contents($url);
$data = json_decode($json, TRUE);
//echo 'latitude: '.$data['results'][0]['geometry']['location']['lat'].'<br/>';
//echo 'longitude: '.$data['results'][0]['geometry']['location']['lng'].'<br/>';
//echo 'Plaats: '.$data['results'][0]['formatted_address'].'<br/>';
// echo '<hr>';
//echo '<h3>Alle restaurants in straal van 25 km.... hemelsbreed dus zonder wegen..</h3>'.'<br/><br/>';
$db = new database(); // Initiate a new MySQL connection
$tableName = "bedrijf_gegevens";
$origLat = $data['results'][0]['geometry']['location']['lat'];
$origLon = $data['results'][0]['geometry']['location']['lng'];
$dist = 25 ; // This is the maximum distance (in miles) away from $origLat, $origLon in which to search
$query = "SELECT *, 6371 * 2 *
ASIN(SQRT( POWER(SIN(($origLat - abs(latitude))*pi()/180/2),2)
+COS($origLat*pi()/180 )*COS(abs(latitude)*pi()/180)
*POWER(SIN(($origLon-longitude)*pi()/180/2),2)))
as distance FROM $tableName WHERE
longitude between ($origLon-$dist/abs(cos(radians($origLat))*69))
and ($origLon+$dist/abs(cos(radians($origLat))*69))
and latitude between ($origLat-($dist/69))
and ($origLat+($dist/69))
having distance < $dist ORDER BY distance limit 100;";
$result = $db->query($query);
while($rows = mysqli_fetch_assoc($result))
{
// Bedrijven in de buurt maar zijn er deals?
$omschrijving = $rows['lange_omschrijving'];
$stringCut = substr($omschrijving , 0, 180);
// Eindigen in een woord.
$omschrijving = substr($stringCut, 0, strrpos($stringCut, ' ')).'...';
echo '<div class="col-md-4">';
echo '<div class="image-box team-member">
<div class="overlay-container">
<img style="width:100%; height:275px;" alt="" src="'.verkrijgBedrijfsHoofdImageByKlantId($rows['klant_id']).'">
<div class="overlay">
<ul class="social-links colored clearfix">
<li class="facebook"><a href="http://www.facebook.com" target="_blank"><i class="fa fa-facebook"></i></a></li>
<li class="twitter"><a href="http://www.twitter.com" target="_blank"><i class="fa fa-twitter"></i></a></li>
<li class="skype"><a href="http://www.skype.com" target="_blank"><i class="fa fa-skype"></i></a></li>
</ul>
</div>
</div>
<div class="image-box-body">
<h3 class="title">'.verkrijgBedrijfsTypeByBedrijfTypeId($rows['type_bedrijf']).' '.$rows['bedrijfsnaam'].' in '.$rows['plaatsnaam'].'</h3>
<small>'.verkrijgActieTitelByBedrijfId($rows['klant_id']).'</small>
<div class="separator-2"></div>
<p>'.verkrijgOmschrijvingByBedrijfId($rows['klant_id']).'</p>
</div>
</div></div>';
}
?>
Stel dat je een id geeft in bedrijf gegevens die ook in acties staat:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT
*
FROM
bedrijf_gegevens
INNER JOIN bedrijf_acties
WHERE
bedrijf_gegevens.bedrijf_id = bedrijf_acties.bedrijf_id
*
FROM
bedrijf_gegevens
INNER JOIN bedrijf_acties
WHERE
bedrijf_gegevens.bedrijf_id = bedrijf_acties.bedrijf_id
Dit zou in principe alles moeten laten zien.
Afhankelijk hoe je database in elkaar zit moet je dus kiezen welk veld overeenkomt.
Zijn dit er meerdere, dan moet je er meerdere invullen.
Nog een tip: probeer eerst je query gewoon op te stellen, dit kan in PHPmyadmin bijvoorbeeld of een andere software als b.v. Workbench.
Gewijzigd op 30/10/2015 13:24:30 door Peter K
Peter K op 30/10/2015 13:23:36:
Begin eens wat eenvoudiger, welke kolommen komen overeen uit beide tabellen?
Stel dat je een id geeft in bedrijf gegevens die ook in acties staat:
Dit zou in principe alles moeten laten zien.
Afhankelijk hoe je database in elkaar zit moet je dus kiezen welk veld overeenkomt.
Zijn dit er meerdere, dan moet je er meerdere invullen.
Nog een tip: probeer eerst je query gewoon op te stellen, dit kan in PHPmyadmin bijvoorbeeld of een andere software als b.v. Workbench.
Stel dat je een id geeft in bedrijf gegevens die ook in acties staat:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT
*
FROM
bedrijf_gegevens
INNER JOIN bedrijf_acties
WHERE
bedrijf_gegevens.bedrijf_id = bedrijf_acties.bedrijf_id
*
FROM
bedrijf_gegevens
INNER JOIN bedrijf_acties
WHERE
bedrijf_gegevens.bedrijf_id = bedrijf_acties.bedrijf_id
Dit zou in principe alles moeten laten zien.
Afhankelijk hoe je database in elkaar zit moet je dus kiezen welk veld overeenkomt.
Zijn dit er meerdere, dan moet je er meerdere invullen.
Nog een tip: probeer eerst je query gewoon op te stellen, dit kan in PHPmyadmin bijvoorbeeld of een andere software als b.v. Workbench.
Klant_id komt in beide tabellen voor maar ik weet niet hoe ik in die moeilijke haversine formule query een join kan inbouwen.
Als je niet in een high-performance situatie zit dan kun je net zo goed binnen de lus die de haversone data verwerkt een tweede query draaien die per gevonden bedrijf de acties ophaalt zodat je ze apart terugkrijgt per bedrijf.
JOIN is niet altijd de gewenste oplossing!
Furio Scripting op 30/10/2015 16:24:03:
Klant_id komt in beide tabellen voor maar ik weet niet hoe ik in die moeilijke haversine formule query een join kan inbouwen.
Peter K op 30/10/2015 13:23:36:
Begin eens wat eenvoudiger, welke kolommen komen overeen uit beide tabellen?
Stel dat je een id geeft in bedrijf gegevens die ook in acties staat:
Dit zou in principe alles moeten laten zien.
Afhankelijk hoe je database in elkaar zit moet je dus kiezen welk veld overeenkomt.
Zijn dit er meerdere, dan moet je er meerdere invullen.
Nog een tip: probeer eerst je query gewoon op te stellen, dit kan in PHPmyadmin bijvoorbeeld of een andere software als b.v. Workbench.
Stel dat je een id geeft in bedrijf gegevens die ook in acties staat:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT
*
FROM
bedrijf_gegevens
INNER JOIN bedrijf_acties
WHERE
bedrijf_gegevens.bedrijf_id = bedrijf_acties.bedrijf_id
*
FROM
bedrijf_gegevens
INNER JOIN bedrijf_acties
WHERE
bedrijf_gegevens.bedrijf_id = bedrijf_acties.bedrijf_id
Dit zou in principe alles moeten laten zien.
Afhankelijk hoe je database in elkaar zit moet je dus kiezen welk veld overeenkomt.
Zijn dit er meerdere, dan moet je er meerdere invullen.
Nog een tip: probeer eerst je query gewoon op te stellen, dit kan in PHPmyadmin bijvoorbeeld of een andere software als b.v. Workbench.
Klant_id komt in beide tabellen voor maar ik weet niet hoe ik in die moeilijke haversine formule query een join kan inbouwen.
Check deze anders eens: http://www.w3schools.com/sql/sql_join_inner.asp