Binnen mijn script gebruik ik deze sql opdracht om alle regels uit een tabel te lezen.

<?php
$sqlCombination = "
	SELECT person.*, horse.*, 2010Combination.* 
	FROM FEIPerson AS person
	INNER 
			JOIN 2010Combination ON person.fei_id = 2010Combination.personFEIid 
	INNER 
			JOIN FEIHorse horse ON horse.fei_id = 2010Combination.horseFEIid 
	GROUP 
			BY 2010Combination.personFEIid
	ORDER 
			BY person.competing_for_country, 2010Combination.compNumber ASC";
?>

En dit is het stukje script dat ik gebruik om o.a. het aantal regels te weten te komen:

<?php
$Result = mysqli_query($dblink, $sqlCombination);
if(!$Result) {
	$html = 'There is een error opening table for listing Combinations; '.mysqli_error();
	$pdf->writeHTML($html, true, false, true, false, ' ');
	}
$numberCombination = mysqli_affected_rows($dblink);
?>

In $numberCombination komt dan het aantal regels te staan, echter deze waarde is foutief.
Kijkend met PHPMYADMIN op de webserver staan in de tabel 3 regels terwijl de waarde in $numberCombination 1 is.
Waar kan dit verschil vandaan komen aangezien ik geen enkele WHERE clausule in de sql opdracht heb staan.

Harry
Het enige wat ik me kan denken is dat er niet gefetched word, en dan wordt er een enkel record gebruikt.
Je moet mysqli_num_rows hebben, je wilt immers het aantal records weten en niet het aantal records dat geraakt is door een DELETE of UPDATE. Overigens klopt je GROUP BY ook niet. In een GROUP BY dien je ALLE velden te noemen die geen deel zijn van een aggregate.
Ik zal voor de duidelijkheid het gehele script plaatsen:

<?php
$sqlCombination = "
	SELECT person.*, horse.*, 2010Combination.* 
	FROM FEIPerson AS person
	INNER 
			JOIN 2010Combination ON person.fei_id = 2010Combination.personFEIid 
	INNER 
			JOIN FEIHorse horse ON horse.fei_id = 2010Combination.horseFEIid 
	GROUP 
			BY 2010Combination.personFEIid
	ORDER 
			BY person.competing_for_country, 2010Combination.compNumber ASC";

$Result = mysqli_query($dblink, $sqlCombination);
if(!$Result) {
	$html = 'There is een error opening table for listing Combinations; '.mysqli_error();
	$pdf->writeHTML($html, true, false, true, false, ' ');
	}
$numberCombination = mysqli_affected_rows($dblink);

	if(!$result || ($numberCombination < 0)) {		} 
	elseif($numberCombination > 0) {
		for($i=0; $i<$numberCombination; $i++) {
			$Row = mysqli_fetch_assoc($Result);
			
			$pdf->SetFont('arialunicid0', '', 9);
			$pdf->SetFont('helvetica', '', 9);
				
			if($riderNF != $Row['competing_for_country']) {
				$sqlCountry = "SELECT e_country FROM country WHERE ISO_A3 = '".$Row['competing_for_country']."'";
		
				if (!(@ $resultCountry = mysqli_query($dblink, $sqlCountry))) {
					$html = 'There was an error running your query: '.mysqli_error($dblink);
					$pdf->writeHTML($html, true, false, true, false, ' ');
					}
				
//				$country_name  = mysqli_result($resultCountry, 0, e_country);// Vervangen door onderstaande regel
				$country_name = mysqli_fetch_assoc($resultCountry);

$tbl = 'T E S T';
$report = ' Groom-Accomodation';
					$html = '<br /><br />'.$Row['e_country'].'  <font size="+4"><b>'.$numberCombination.'</b></font> ('.$Row['competing_for_country'].')<br />
							 <table cellspacing="0" cellpadding="0" border="1" width="100%"> 
								<tr>
									<th width="18"> </th>
									<th width="175">Rider</th>
									<!--th width="210">Horse</th--><!-- In 2015 vervallen -->
									<th width="75">Bad Boekelo</th>
									<th width="50">Caravan</th>
									<th width="175">Groom</th>
								</tr>
								<tr>
									<td>'.$Row['stableNumber'].'</td>
									<td>'.$Row['stayHorseBox'].'</td>
									<td>'.$Row['nameGroom'].'</td>
									<td>'.$Row['genderGroom'].'</td>
									<td>'.$Row['caravanNumber'].'</td>
								</tr>
							</table>';
			}
		}
	}		
?>
Je gebruikt $Result met beginhoofdletter op regel 14 naast $result in kleine letters op regel 21.
Kies één vaste vorm, zodat je die vergissing nooit kunt maken.
SELECT *
in combinatie met GROUP BY is eigenlijk altijd fout.

Ok. Niet per se, omdat in de situatie dat je weet welke kolommen er vanuit dat * komen, en je vervolgens al die kolommen in group by gooit, het toch goed gaat. Maar omdat iemand die dat snapt geen SELECT * had gebruikt.

Dat gezegd hebbend:
GROUP BY heeft helemaal niets te zoeken in deze query.
Ik zie namelijk geen aggregatie functie, zoals SUM() of COUNT() in je query staan. Dus wat valt er te groupen? Klinkt meer als een misbruik tot een soort van DISTINCT dat als zij-effect bij groupby kan optreden.
Een onvoorspelbaar zij-effect ook nog eens. Wat in eerste instantie correct lijkt zal vroeg of laat vreselijk foute resultaten gaan opleveren.
Dan een voorstel hoe deze query wel juist te maken. Ik wil graag op voorhand alle gegevens uit de drie tabellen om deze in een raport te gaan gebruiken. als dat eenvoudiger kan graag.
dezelfde query zonder het stuk


GROUP
            BY 2010Combination.personFEIid


en als dat niet levert, wat je wilt, dan verder kijken hoe op te lossen
Hoi Ivo je was te snel met je antwoord en ik te traag met de vraag.

Bij alle raporten wordt er per land een pagina gemaakt en op de pagina kan een ruiter meerdere paarden hebben
dus je select uit de personen (ruiters) tabel
kijkt (joint) in de koppeltabel naar welke paard-id's daarbij horen
en haalt uit de paardentabel op basis van het paard-id het paard erbij.

Dat is wat je query doet.

En nu? Wat is je vraag?

btw: SELECT tabel.* is gemakzuchtig. Heb je alle kolommen echt nodig? Het je dan geen last van dubbel voorkomede kolomnamen (horse.name, person.name bijvoorbeeld)

Reageren