mysql - 查询以查找同一张表中的差异

标签 mysql

所以我遇到了从查询中获取正确数据的问题。

我有下表(人):

Name  |       xpath        |   value
Derek |  /body/torso/arm   |   left
Derek |  /body/torso/arm   |   right
Derek |  /body/torso/neck  |   Head
Ron   |  /body/torso/neck  |   Head
Ron   |  /body/torso/arm   |   left

所以基本上我试图获得的查询结果是显示差异(两个人之间缺少什么)。

results:
Name1 |       xpath1       |   value1   | Name2  |   xpath2         |   value2
Derek |  /body/torso/arm   |   right    | Ron    |    NULL          |   NULL

我什至可以得到以下回复

results:
Name1 |       xpath1       |   value1   | Name2  |   xpath2         |   value2
Derek |  /body/torso/arm   |   right    | Ron    |    NULL          |   NULL
Derek |  /body/torso/arm   |   left     | Ron    | /body/torso/arm  |   left  
Derek |  /body/torso/neck  |   Head     | Ron    | /body/torso/neck |   Head    

我使用的查询是:

SELECT P.Name , P.xpath, P.value, P1.Name, P2.xpath, P3.value
FROM Person as P
LEFT OUTER JOIN
    Person as P2 ON P.xpath = P2.xpath
WHERE
         P.Name = "Derek"
    AND  P2.Name = "Ron"

无论我尝试什么,我一直得到的结果基本上是重叠的数据,但从来不是我真正想要的,似乎我遗漏了一些简单的东西或者只是明显做错了。有什么建议么?最终,我将在 SPROC 中运行它,但如果能够处理多个名称,而不仅仅是 2 个,那将是很好的,但如果我有,Derek、Ron、John、Dawn 等。

最佳答案

试一试:

SELECT    a.Name  AS Name1,
          a.xpath AS xpath1,
          a.value AS value1,
          'Ron'   AS Name2,
          b.xpath AS xpath2,
          b.value AS value2
FROM      Person a
LEFT JOIN Person b ON b.Name = 'Ron'
                  AND a.xpath = b.xpath 
                  AND a.value = b.value
WHERE     a.Name = 'Derek' AND
          b.Name IS NULL

SQLFiddle Demo


如果你想将 Derek 与多个名字进行比较,你可以对所有要比较的名字进行 CROSS JOIN(以便名字可以出现在结果集中),然后 LEFT使用 xpathvalue 以及 CROSS JOIN 中指定的名称 JOIN 同一个表:

SELECT     a.Name  AS Name1,
           a.xpath AS xpath1,
           a.value AS value1,
           b.Name  AS Name2,
           c.xpath AS xpath2,
           c.value AS value2
FROM       Person a
CROSS JOIN (
           SELECT 'Ron' AS Name UNION ALL
           SELECT 'John'        UNION ALL
           SELECT 'Charles'     UNION ALL
           SELECT 'Aaron'
           ) b
LEFT JOIN  Person c ON b.Name  = c.Name 
                   AND a.xpath = c.xpath
                   AND a.value = c.value
WHERE      a.Name = 'Derek' AND
           c.Name IS NULL

SQLFiddle Demo


如果您想在比较的左侧有多个名字(不仅仅是“Derek”),只需更改

a.Name = 'Derek'

a.Name <> b.Name

在上面的查询中。


SQLFiddle Demo


编辑:更进一步:

将所有名称与所有名称进行比较:

SELECT     a.Name  AS Name1,
           a.xpath AS xpath1,
           a.value AS value1,
           b.Name  AS Name2,
           c.xpath AS xpath2,
           c.value AS value2
FROM       Person a
CROSS JOIN (SELECT DISTINCT Name FROM Person) b
LEFT JOIN  Person c ON b.Name  = c.Name 
                   AND a.xpath = c.xpath
                   AND a.value = c.value
WHERE      a.Name <> b.Name AND 
           c.Name IS NULL

关于mysql - 查询以查找同一张表中的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11992522/

相关文章:

mysql - 使用 JDBC Mysql 连接时出错

c++ - qt里面的mysql创建过程(create语句)

PHP/MySQL - 创建每周报告

PHP-MySQL : Create variable for undefined index

php - PDO - 如何在结果索引中使用表和列?

mysql - 将行转换为mysql数据库中的列

javascript - 将数组发送到 PHP Web 服务并从 MySQL 数据库返回数组

mysql - MySql 中使用了哪种数据结构?

mysql - 如何将 XML 转换为 SQL?

php - 根据每个分类的多重评级获取帖子