每个左表结果,Sql从右表返回一行

时间:2014-12-15 18:12:49

标签: mysql sql join

我的问题是如何从表1的表1中获得每个结果的1个结果?而不是来自table2的结果?我已经搜索了堆栈溢出我发现如何使用id解决这个问题,但我想知道如何使用Varchar列来完成此操作。

表1

+--------------+-------------+
| Ip (Varchar) | Count (Int) |
+--------------+-------------+
| 1.1.1.1      | 9           |
| 1.1.1.2      | 6           |
| 1.1.1.3      | 1           |
+--------------+-------------+

表2

+-------------+--------------+
| Name (Text) | Ip (Varchar) |
+-------------+--------------+
| User01      | 1.1.1.1      |
| User034     | 1.1.1.1      |
| User012     | 1.1.1.1      |
| User21      | 1.1.1.2      |
| User24      | 1.1.1.2      |
| User3       | 1.1.1.3      |
+-------------+--------------+

通缉结果

+--------+---------+-------+
| Name   | Ip      | Count |
+--------+---------+-------+
| User01 | 1.1.1.1 | 9     |
| User21 | 1.1.1.2 | 6     |
| User3  | 1.1.1.3 | 1     |
+--------+---------+-------+

返回什么名称并不重要。

2 个答案:

答案 0 :(得分:1)

由于您只需要一个随机名称,因此您可以使用group by,因为您正在使用mysql

select t1.ip, t1.count, t2.name
from table1 t1 
    join table2 t2 on t1.ip = t2.ip
group by t1.ip

根据您的数据,您可能还需要outer join

答案 1 :(得分:1)

您应该首先在ip地址匹配的情况下将两个表连接在一起:

SELECT t2.name, t2.ip, t1.count
FROM firstTable t1
JOIN secondTable t2 ON t1.ip = t2.ip;

但是,这将返回第二个表中具有匹配ip的所有行,因此结果将出现多次。如果您只想查看特定的配对,则应按ip列进行分组:

SELECT t2.name, t2.ip, t1.count
FROM firstTable t1
JOIN secondTable t2 ON t2.ip = t1.ip
GROUP BY ip;

name而言,如果你不挑剔,你可以像上面那样保留它,它将被任意挑选,或者你可以选择像最小用户名一致的东西:

SELECT MIN(t2.name), t2.ip, t1.count
FROM firstTable t1
JOIN secondTable t2 ON t2.ip = t1.ip
GROUP BY ip;

这是一个SQL Fiddle示例。它显示了所有三个查询,因此您可以看到我采取的步骤。