MYSQL联合查询查找另一个表?

时间:2012-11-08 15:18:15

标签: mysql count union

我有一个查询(下面)将检查3个表中的匹配项。所有3个表都有UID和IPADDRESS列;第三个表也有USERNAME。如何更改下面的查询以使用与ipaddress匹配的唯一用户名列表填充变量$ username?

所以在每个表中,ipaddress匹配的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);

目前,查询的工作方式与编写文件的工作量相同。所有帮助表示赞赏:)

1 个答案:

答案 0 :(得分: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上取消了PHP,在大多数情况下 - $ips标记了需要IP地址的位置。 UNION(没有ALL)消除了重复的用户ID值;唯一用户ID列表与User表连接以生成相应的用户名。

请注意,这将生成多个行,每个用户名一个。您的问题在输出中的用户ID和用户名之间是不明确的;如果您只需要该号码,则只需要UNION子查询作为主查询。有一些MySQL机制,例如GROUP_CONCAT,可以从列表中创建单个值。阅读手册。