Archief - PHP: samenvoegen 2 recordsets

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

deadlock

Legacy Member
Ik doe dus het volgende:
PHP:
$query = "SELECT platform, vis_hits AS 'total' 
				FROM tblPlatform
				ORDER BY total DESC";
	$result = mysql_query($query);

	$query = "SELECT platform, COUNT(platform) AS 'total' 
				FROM tblStats
				GROUP BY platform
				ORDER BY total DESC";
	$result2 = mysql_query($query);
Hoe kan ik deze 2 resultaten nu samenvoegen zodat ik ze getotaliseerd op het scherm kan tonen?

Legendary d.C.

Legacy Member
PHP:
while($row = mysql_fetch_array($result); $rij = mysql_fetch_array($result2)){
echo("blabla");
}

ik heb het zelf nog nooit zoiets gebruikt maar ik vermoud dat dit wel zou kunnen werken

WHiSPy

Legacy Member
PHP:
"SELECT p.platform, p.vis_hits AS total1, s.platform, COUNT(s.platform) AS total2
                FROM tblPlatform p, tblStats s
                GROUP BY s.platform
                ORDER BY p.total, s.total DESC";

Zoiets zou de truc ook moeten doen. Dit is vooral trial and error vermoed 'k... :)

deadlock

Legacy Member
Is niet helemaal wat ik bedoel, want dan krijg ik
Code:
WINDOWS  |  500  |  WINDOWS  |   20
LINUX    |  150  |  LINUX    |   10
MAC OS   |  50   |  MAC OS   |   4
en ik wil
Code:
WINDOWS  |  520
LINUX    |  160
MAC OS   |  54

Obliv`

Legacy Member
laat dan die s.platform weg uit uw select
tel vervolgens totaal1 op bij totaal2

*edit

LB was me te snel af ;)

Squall-sX-

Legacy Member
In PHP zelf zou ik het zo doen:
PHP:
$results = array();
while( $row = mysql_fetch_array($result) ) {
	$gevonden = false;
	
	while( $row2 = mysql_fetch_array($result) && $gevonden!=true ) {
		if( $row[0] == $row2[0] ) {
			$results[] = array( 'platform' => $row[0], 'total' => $row[1] + $row2[1] );
			$gevonden = true;
		}
	}
	if( !$gevonden )
		$results[] = array( 'platform' => $row[0], 'total' => $row[1] );	
}
while( $row2 = mysql_fetch_array($result) ) {
	$gevonden = false;
	for( $i=0; $i<count( $results ); $i++ ) {
		if( $results[$i][0] == $row2[0] ) {
			$gevonden = true;
		}
	}
	if( !$gevonden )
		$results[] = array( 'platform' => $row2[0], 'total' => $row2[1] );
}

De eerste resultset doorlopen, en controleren met de volgende resultset. Als daar een item met dezelfde naam in voorkomt, dit item opslaan in de nieuwe array, met de som van beide resultsets. Als er geen item is met dezelfde naam in de tweede set, dan voegen we gewoon het huidige item van de eerste set toe.
Dan herhalen we dit met de tweede set, maar dan met controle bij de nieuwe array, omdat we alleen de items willen hebben die we voergeslagen hebben omdat ze niet in de eerste resultset zaten.

Der zal wel een simpeler manier zijn, ma dees zou moeten werken, indien die while mij die tweede conditie toestaat, en er geen pointer herzet moet worden voor de mysql_fetch_arrays.

Obliv`

Legacy Member
Squall-sX- zei:
In PHP zelf zou ik het zo doen:
De eerste resultset doorlopen, en controleren met de volgende resultset. Als daar een item met dezelfde naam in voorkomt, dit item opslaan in de nieuwe array, met de som van beide resultsets. Als er geen item is met dezelfde naam in de tweede set, dan voegen we gewoon het huidige item van de eerste set toe.
Dan herhalen we dit met de tweede set, maar dan met controle bij de nieuwe array, omdat we alleen de items willen hebben die we voergeslagen hebben omdat ze niet in de eerste resultset zaten.

Der zal wel een simpeler manier zijn, ma dees zou moeten werken, indien die while mij die tweede conditie toestaat, en er geen pointer herzet moet worden voor de mysql_fetch_arrays.

niet echt performant eh :)

gewoon uw sql wat aanpassen en tis al inorde
kzal u wa in de goede richting sturen (ik geen geen mysql, wel oracle. Maar het zou wel ongeveer hetzelfde moeten zijn)

PHP:
"SELECT p.platform, (p.vis_hits + COUNT(s.platform)) AS total
FROM tblPlatform p, tblStats s 
GROUP BY s.platform 
ORDER BY p.total, s.total DESC";

kweet nu ook niet hoe je tabellen eruit zien (datatype etc), dus het kan zijn dat ik hier grandioos in de fout ga ;)

google best eens op 'single row functions'

killgore

Legacy Member
GROUP BY s.platform, p.platform

of

GROUP BY p.platform

:s

eigenlijk zou het iets duidelijker zijn als we deftig uw db structuur krijgen, met 1 query alleen ben je niet veel om zoiets op te bouwen ;).

Squall-sX-

Legacy Member
Je gaat dan volgens mij voor elk element van platform, elk element van stats hebben, aangezien er nergens rijen aan elkaar verbonden worden. Je zoudt dus eigenlijk moeten joinen als je het via SQL wilt doen. En dan moet je ook nog hopen dat MySQL 3 ondersteunt wat je wilt doen.
De oplossing in PHP is misschien niet performant, maar wel leuk om op terug te vallen als je DBMS niet mee wilt.

deadlock

Legacy Member
Ik heb idd een oplossing via PHP (op basis van die van Squall-sX-, maar een SQL-only oplossing zou natuurlijk performanter zijn...

Structuur van de tabellen:

Code:
tblPlatform                         tblStats
----------                          --------
ID          int(10)                 ID         int(10)
platform    varchar(100)            ts        timestamp
vis_unique  int(10)                 platform  varchar(100)
vis_hits    int(10)                 browser   varchar(100)
                                    referer   varchar(255)

deadlock

Legacy Member
De gegeven oplossingen in SQL werken dus niet

Ik krijg het volgende terug:
Code:
platform   	total
--------        -----
Windows 	1598
Windows 	1577

de query met UNION zou theoretisch werken, maar wordt niet ondersteund door mijn MySQL 3.23 database.

GuntherDW

Legacy Member
deadlock zei:
De gegeven oplossingen in SQL werken dus niet

Ik krijg het volgende terug:
Code:
platform   	total
--------        -----
Windows 	1598
Windows 	1577

de query met UNION zou theoretisch werken, maar wordt niet ondersteund door mijn MySQL 3.23 database.

ge kunt toch

SELECT (tbl_stats.Windows+site_stats.Windows) FROM .........;
doen?

[voorbeeld]
Code:
mysql> select * from members;
+----+----------------+------+-----------+----------------+----------+
| ID | nick           | rank | site_rank | country        | comments |
+----+----------------+------+-----------+----------------+----------+
|  1 | Kakasi         |    1 |         2 | United Kingdom |          |
|  2 | LicktorR       |    1 |         2 | Denmark        |          |
|  3 | riVen          |    2 |         2 | Germany        |          |
|  4 | GuntherDW      |    2 |         1 | Belgium        |          |
|  5 | od1n           |    2 |         2 | Norway         |          |
|  6 | st3            |    2 |         2 | United Kingdom |          |
|  7 | D3Fragezeichen |    2 |         2 | Germany        |          |
+----+----------------+------+-----------+----------------+----------+
7 rows in set (0.02 sec)

mysql> select (rank+site_rank) from members;
+------------------+
| (rank+site_rank) |
+------------------+
|                3 |
|                3 |
|                4 |
|                3 |
|                4 |
|                4 |
|                4 |
+------------------+
7 rows in set (0.00 sec)

deadlock

Legacy Member
Dat werkt idd als volgt:
Code:
SELECT p.platform, (COUNT(s.platform) + p.vis_hits) AS 'total' 
FROM tblStats s 
  LEFT OUTER JOIN tblPlatform p
  ON p.platform = s.platform
GROUP BY p.platform 
ORDER BY total DESC
Dan krijg ik:
Code:
platform   	total
--------        -----
Indeterminable 	11258
Windows 	1577
Macintosh 	13
Als er nu echter een record met "Linux" als platform in tblPlatform komt, wordt deze niet getoond.
Nemen we een right outer join, dan vica versa

Daarnaast ondersteunt MySQL 3.23 geen FULL OUTER JOIN.

We zijn er bijna :)

dJeez

Legacy Member
Doe eerst een left outer join tussen tabel1 en tabel2 en gooi 't resultaat in een array. Doe dan een right outer join van het verschil (dwz daar waar er wel iets is ingevuld voor tabel2 en niet voor tabel1 maw, waar tabel1.id is null) en gooi die resultaten in een array. Voeg nu beide arrays samen. Dan heb je hetzelfde resultaat als een full outer join (uiteraard enkel te gebruiken voor MySQL 3.X, anders kan je daar een union voor gebruiken met dezelfde queries).

deadlock

Legacy Member
dJeez zei:
Doe dan een right outer join van het verschil (dwz daar waar er wel iets is ingevuld voor tabel2 en niet voor tabel1 maw, waar tabel1.id is null) en gooi die resultaten in een array.
Ik krijg geen nullwaarden terug:

LEFT OUTER JOIN:
Code:
platform        total
Indeterminable 	11261
Windows 	1585
RIGHT OUTER JOIN:
Code:
platform        total
Indeterminable 	11261
Windows 	1585
Macintosh  	13
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan