2016-03-31 1 views
0

Mit PHP wähle ich aus mySQL-Tabelle einige Zeilen, die den Spaltenhash für einen bestimmten Tag enthalten. Alle diese Zeilen sind einzigartig. Auch von Tabelle zwei mache ich das gleiche, ich bekomme den Spaltenhash für einen bestimmten Tag, wieder Uniques.Verwenden von PHP Wie kann ich zählen, wie viele Elemente eines mySQL-Ergebnisses in der zweiten vorhanden sind?

Mit PHP, wie kann ich wissen, wie viele Hash aus Tabelle eins in Tabelle zwei gefunden werden?

$first_visits=mysql_query("SELECT hash AS first_visit 
FROM audience 
WHERE DATE(TIMESTAMP) = '2016-03-28'"); 

$visits=mysql_query("SELECT DISTINCT (
hash 
) AS visit 
FROM behaviour 
WHERE DATE(TIMESTAMP) = '2016-03-29'"); 

Jetzt will ich die erste Gruppe mit der zweiten Gruppe zu vergleichen, um herauszufinden, wie viele der ersten in dem zweiten mit PHP diese

+0

Sie brauchen nur eine Zählung, oder genaue Hash-Strings? – mitkosoft

+0

möchten Sie "' PHP 'verwenden "reine PHP-Lösung? Ich wundere mich, warum jeder in SQL antwortet. –

Antwort

0

Sie können durch Verbinden der beiden Tabellen hash Spalte mit einzelnen SQL-Abfrage tun:

Wenn Sie nur eine Zählung:

SELECT 
    COUNT(DISTINCT v.`hash`) hashCount 
FROM 
    first_visit v 
    INNER JOIN behaviour b ON v.`hash` = b.`hash` 
WHERE 
    DATE(v.`timestamp`) = '2016-03-28' 
    AND DATE(b.`timestamp`) = '2016-03-29' 

Wenn Sie genaue Hash-Strings benötigen, wählen Sie sie aus:

SELECT 
    DISTINCT v.`hash` 
FROM 
    first_visit v 
    INNER JOIN behaviour b ON v.`hash` = b.`hash` 
WHERE 
    DATE(v.`timestamp`) = '2016-03-28' 
    AND DATE(b.`timestamp`) = '2016-03-29' 

Mit PHP, holen Sie sich einfach das SQL-Ergebnis.

Aber. Um eine bessere Leistung Ergebnis zu erzielen, würde ich vorschlagen, Verwendung von DATE() über eine Säule in WHERE-Klausel zu vermeiden, aber BETWEEN stattdessen zu verwenden, dh zu WHERE-Klauseln wie folgt zu ändern:

WHERE 
    v.`timestamp` BETWEEN '2016-03-28 00:00:00' AND '2016-03-28 23:59:59' 
    AND b.`timestamp` BETWEEN '2016-03-29 00:00:00' AND '2016-03-29 23:59:59' 

Diese Sie verwenden ermöglichen Indizes auf beiden timestamp Spalten.

+0

Hallo Danke für diese Lösung und Ihre wertvollen Informationen. Ich werde es jetzt testen. Ich wusste nicht über die Datumsperformance. Weil ich einen wirklich großen Tisch habe und Leistung zu diesem speziellen Thema ein Problem ist. Soll ich 'between' verwenden oder' <= > = 'stattdessen verwenden? – villoui

+0

In Bezug auf BETWEEN und <=> ist fast das gleiche, der wichtige Punkt hier ist nicht zu verwenden, "WO DATE (Zeitstempel)" – mitkosoft

+0

Ich habe Ihre Lösung akzeptiert. Vielen Dank. Bitte geben Sie mir Ihre 2 Cent, in Bezug auf die Leistung, soll ich 'IN' oder Ihre Lösung mit' JOIN' verwenden? – villoui

-1

versuchen existiert. speichern erste Ergebnis in first_visits_rows, und auf das Abrufen zweite Abfrage vergleichen Einstimmungen finden

$first_visits = mysql_query("SELECT hash AS first_visit FROM audience 

WHERE DATE(TIMESTAMP) = '2016-03-28'"); 
$first_visits_rows = []; 
while ($r = mysql_fetch_assoc($first_visits)) { 
    $first_visits_rows[$r["hash"]] = $r["hash"]; 
} 

$visits = mysql_query("SELECT DISTINCT (hash) AS visit FROM behaviour WHERE DATE(TIMESTAMP) = '2016-03-29'"); 
$matches = 0; 
while ($r = mysql_fetch_assoc($visits)) { 
    if (isset($first_visits_rows[$r["hash"]])) { 
     $matches++; 
    } 
} 
echo $matches; 

oder Sie können Verwendung mysql beitreten, um direkt zu erhalten Streichhölzer

$first_visits=mysql_query("SELECT count(hash) as matches from first_visit as f join behaviour as b on f.hash=b.hash"); 
$r = mysql_query($first_visits); 
$matches = $r["matches"]; 
+0

Nein. Ich wähle Hash aus jeder Tabelle, um sie zu vergleichen – villoui

+0

Der Typ sucht nach der Anzahl der passenden Hash-Datensätze von der ersten Tabelle in die zweite ... – mitkosoft

+0

aah. Es tut mir leid, ich werde meinen Code ändern – LightNight

0

Ich glaube, Sie haben holen Sie Ihre Anfragen an Array olso Verwenden Sie array_intersec (array1, array2), um ein Array mit dem gemeinsamen Ergebnis zu erhalten.

0

Diese Abfrage:

SELECT DISTINCT (hash) AS visit FROM behaviour WHERE DATE(TIMESTAMP) = '2016-03-29' and hash in (SELECT hash AS first_visit FROM audience WHERE DATE(TIMESTAMP) = '2016-03-28')

+0

Die Verwendung der IN-Klausel (anstelle von EXISTS, die viel schneller ist) in Kombination mit der Unterabfrage wirkt sich stark auf die Leistung aus, da MySQL diese Unterabfrage erfüllen muss. Bei großen Datenmengen ist diese Abfrage sehr langsam. – mitkosoft

Verwandte Themen