假设我有一个包含3条记录的表[a], [b], [c]
。
我希望返回a, b, c
,直到创建d
。 D
可以是a, b or c
的重复,但一列中的值除外:x
会有所不同。
N.B:我的数据库是MySQL,我在ColdFusion中的后端,当我说'用户编辑'或者'用户看到列表',我的意思是用户看到要编辑的项目的网页列表。如果你认为以编程方式做得更好,而不是数据库做这项工作,我会很感激输入。
所以我喜欢的是:
a,b,c
。c
。 c
与d
重复,在x
列中有不同的值。 a,b,d
的列表。 b
。b
与e
重复,x
列的值不同。a,e,d
。等...
似乎应该是SELECT [fooRecord] UNLESS [barRecord exists]
的情况,在这种情况下会带回[barRecord]
。我已经四处寻找类似的答案了,有些人确实使用EXISTS
,但这似乎只会返回真值或假值,而不是我想要的记录。我认为它是一个奇特的子查询或我需要的INNER JOIN
,但我不知道如何去思考它的确切语法。
这是我第一次在SO上发帖,所以如果我错误地完成了任何部分或者我的问题不清楚,我会道歉,如果被要求,我会提供清晰度或更多信息。任何帮助非常感谢。
答案 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#">
)
)
)
我尝试格式化答案,以便于阅读。谢谢你的其他答案。