2012-11-08 56 views
0

我有一個查詢(下面)將檢查3個表中的匹配。所有3個表都有列UID和IPADDRESS;第三張表也有USERNAME。我怎樣才能改變下面的查詢來填充變量$ username與唯一的用戶名匹配的ipaddress列表?MYSQL聯合查詢查找另一個表?

因此,在每個表中,與IP地址相匹配的UID可以說是2,3,6,6,23,2,6,因爲有多個條目,並且有人可能欺騙了其他IP。我想要的是查詢使用與UID 2,3,6,23(唯一列表)相匹配的用戶名填充$ username。我必須告訴你,我對MySQL和查詢完全陌生。以下是查詢:

error_reporting(E_ALL & ~E_NOTICE & ~8192); 
$UAM = strtoupper($_SERVER['HTTP_USER_AGENT']); 
$ips = strtoupper($_SERVER['REMOTE_ADDR']); 

$myquery= "select sum(total) 
FROM (SELECT count(*) as total,userid 
     FROM " .TABLE_PREFIX."memberviews v 
     where v.ipaddress = '$ips' 
     union all 
     SELECT count(*) as total,userid 
     FROM " .TABLE_PREFIX."membervisits v1 
     where v1.ipaddress = '$ips' 
     union all 
     SELECT count(*) as total,userid 
     FROM " .TABLE_PREFIX."user v3 
     where v3.ipaddress = '$ips' 
    )src"; 

$result = mysql_query($myquery); 
$rowCount = mysql_num_rows($myquery); 
$row = mysql_fetch_array($myquery); 
$username = $row['userid']; 

    If($rowCount !=0){ 
     $fp = fopen("logtext.txt", "a"); 
$DateOfRequest = date('m-d-Y H:i:s'); 
fwrite($fp, "Registration Attempt\n\nDate: . $DateOfRequest . \nMatched Member: . $username . \nWith User Agent: . $UAM . \nIP: . $ips . \n\n"); 
    } 
mysql_free_result($myquery); 

當前查詢的工作原理與寫入文件一樣多。所有的幫助表示讚賞:)

回答

0

如果我正確理解你的問題,這將讓你與IP地址關聯的用戶名列表:

SELECT username 
    FROM uses AS u 
    JOIN (SELECT userid 
      FROM memberviews AS v1 
     WHERE v1.ipaddress = $ips 
     UNION 
     SELECT userid 
      FROM membervisits AS v2 
     WHERE v2.ipaddress = $ips 
     UNION 
     SELECT userid 
      FROM user AS v3 
     WHERE v3.ipaddress = $ips 
     ) AS v ON u.userid = v.userid 

我已取消PHP'd的SQL,大多數情況下 - $ips表示需要IP地址。 UNION(不含ALL)消除了重複的用戶ID值;唯一用戶標識列表與用戶表連接以生成相應的用戶名。

請注意,這將生成多行,每個用戶名稱一個。你的問題在輸出中的用戶ID和用戶名之間是不明確的。如果您只需要該號碼,則只需將UNION子查詢作爲主要查詢。有一些MySQL機制,例如GROUP_CONCAT,可以從列表中創建單個值。閱讀手冊。

+0

謝謝你,但我會失去我的計數那麼我不會?我的進一步檢查是看看是否至少有一個匹配被發現然後寫入文件,我將如何合併檢查,如檢查是否有是匹配還是不匹配,所以我可以觸發文件寫入? – Silo

+0

如果它會生成一個唯一的用戶名列表,那很好,我可以檢查$ username爲空或零長度。 – Silo