除非存在类似记录,否则从表中返回某条记录,在这种情况下将该记录带回来

时间:2014-11-26 13:14:45

标签: mysql coldfusion

假设我有一个包含3条记录的表[a], [b], [c]

我希望返回a, b, c,直到创建dD可以是a, b or c的重复,但一列中的值除外:x会有所不同。

N.B:我的数据库是MySQL,我在ColdFusion中的后端,当我说'用户编辑'或者'用户看到列表',我的意思是用户看到要编辑的项目的网页列表。如果你认为以编程方式做得更好,而不是数据库做这项工作,我会很感激输入。

所以我喜欢的是:

  • 用户会看到a,b,c
  • 的列表
  • 用户编辑c
  • cd重复,在x列中有不同的值。
  • 用户会看到a,b,d的列表。
  • 用户编辑b
  • be重复,x列的值不同。
  • 用户会看到a,e,d
  • 的列表

等...

似乎应该是SELECT [fooRecord] UNLESS [barRecord exists]的情况,在这种情况下会带回[barRecord]。我已经四处寻找类似的答案了,有些人确实使用EXISTS,但这似乎只会返回真值或假值,而不是我想要的记录。我认为它是一个奇特的子查询或我需要的INNER JOIN,但我不知道如何去思考它的确切语法。

这是我第一次在SO上发帖,所以如果我错误地完成了任何部分或者我的问题不清楚,我会道歉,如果被要求,我会提供清晰度或更多信息。任何帮助非常感谢。

3 个答案:

答案 0 :(得分:1)

您的架构似乎有点复杂 - 可能是时候重新考虑一下了。通常问题是避免额外的表或列的过度尝试 - 但这可能是添加到模式中的其他元数据以帮助提取此数据的情况。您也可以考虑简单地选择所有数据(a,b,c,d,e),并简单地使用Q的Q来根据X取出所需的行。

与此同时,CASE声明可能会让你到那里。这是完全未经测试的伪代码,但它可能会给你一个想法。

<Cfquery>
    SELECT  
        CASE
            WHEN x = *condition* THEN orig.col1 
            ELSE    mod.col1 
        END CASE
        AS col1,
        CASE
            WHEN x = *condition* THEN orig.col2
            ELSE    mod.col2
        END CASE
        AS col2
    FROM  tablename orig OUTER JOIN tablename mod
            ON (orig.col1 = mod.col1 
                AND orig.col2 = mod.col2
                AND orig.x <> orig.x)       
</cfquery>

我想要做的是将两张桌子加在一起,根据它是否存在来梳理一个值与另一个值。我不确定我是否已完全接受此查询,但您明白了。

另一种方法是UNION - 就像这样:

<Cfquery>
        SELECT  
        col1, col2, col3
        FROM tablename 
        WHERE *primarykey* NOT IN
            (*select rows that DO have duplicates with modified x*)
    UNION ALL
        SELECT  
        col1, col2, col3
        FROM tablename 
        WHERE *primarykey* IN
            (*select rows that WITH the modified x*)        
</cfquery>

这样做的好处是更容易理解。您可以使用一个查询,然后使用另一个查询,然后将它们连接在一起以获得所需内容。

祝你好运 - 看起来令人生畏:)

答案 1 :(得分:1)

我想,我可能错了所以请纠正我,这是一个NoSQL模式。在那个I中,JaredE作为user表中的用户存在,但我的userid不是该表的主键,因此无论何时我或其他人编辑我的记录,它只是插入一条新记录而不是更新我现有的记录

如果你要使用这种模式,那么你就会做类似

的事情
select distinct userid, a,b,c, lastmodified
  from tbl
 ORDER BY lastmodified desc

答案 2 :(得分:1)

在与团队讨论后得出答案:

SELECT * FROM table1 t1 WHERE 1=1 AND ( x = <cfqueryparam value="#arguments.x#"> OR ( x is null and y not in ( SELECT t2.et_code FROM table2 t2 WHERE t2.x = <cfqueryparam value="#arguments.x#"> ) ) )

我尝试格式化答案,以便于阅读。谢谢你的其他答案。