【问题标题】:Nested query not fetching data correctly嵌套查询未正确获取数据
【发布时间】:2013-11-22 11:07:54
【问题描述】:

问题

我有两个不同的表,表名为 team_requestteams[team_request] 拥有每个提交的团队的唯一记录,[teams] 保存具有唯一用户名但与 [team_request] 中相同的团队数据的重复记录对于接受加入该团队的用户。

以下查询的预期结果:

我正在运行以下查询来获取待处理的挑战或团队请求,它们的基本逻辑是从 [team_request] 中获取所有团队,而该团队在 中不存在[teams] 表或未被该用户忽略。

实际上查询在做什么:

它从属于该用户的表 [team_request] 中获取所有行(团队),无论用户是否已排除或忽略。

另外忘了在上面提到 fbC_status[team_request] 中的一个字段,如果用户忽略加入团队,它会保存用户的电子邮件地址。

任何帮助或指导将不胜感激,我只是坚持下去。

MySQL 查询

SELECT *
FROM team_request
WHERE (c_emails LIKE '%joe@example.com%')
  OR (c_emails LIKE '%9876543210%')
  AND fbC_status NOT LIKE '%joe@example.com%'
  AND fbC_status NOT LIKE '%9876543210%'
  AND '%joe@example.com%' NOT IN
    (SELECT username
     FROM teams)
  AND t_name NOT IN
    (SELECT T.t_name
     FROM team_request TR,
          teams T
     WHERE TR.t_name = T.t_name
       AND T.username = '%joe@example.com%'
       AND (TR.fbC_status NOT LIKE '%joe@example.com%'
            AND TR.fbC_status NOT LIKE '%9876543210%')) 
LIMIT 0, 30

【问题讨论】:

  • '%9876543210%' 有什么关系?我是否正确地认为您正在尝试做的是:获取team_request 但不在teams 表中的记录,并且fbC_Status 不包含电子邮件地址?
  • 是的,还有那个号码,这个号码是一个人的电话号码,因为我在构建 phonegap 应用程序时在 AJAX 中使用这个查询。所以是的,你是正确的,但它也是 获取在 team_request 但不在团队表中的记录,并且 fbC_Status 不包含电子邮件地址或电话号码对不起,我在问题中错过了这一点
  • 我不想筛选。将一些适当的 DDL(和/或 sqlfiddle)与所需的结果集一起发布。另请注意,没有 ORDER BY 的 LIMIT 几乎毫无意义。

标签: php mysql sql


【解决方案1】:

我建议您重新考虑数据库的结构,您的 teams 表似乎与 team_requests 几乎是重复的,但鉴于当前的结构,请尝试以下操作:

@phone would be your '9876543210'
@username would be your 'joe@example.com'

SELECT r.*
FROM team_request r
WHERE (r.c_emails = @username OR r.c_emails = @phone)
  AND r.fbC_status <> r.c_emails
  AND r.t_name NOT IN ( SELECT t.name 
                        FROM teams t
                        WHERE /* t.username = r.c_emails otherwise: */
                              t.username = @username /* OR t.phone = @phone*/

                      )

目前还不清楚您的所有字段的用途,因此如果不进行更改,这不太可能有效。注释掉的部分是我怀疑你应该使用的,但我无法知道它们是否适用于你的表。

您可以随意使用您的LIKE '%...%',但请记住,如果用户的电子邮件地址为at@email.com,那么当电子邮件地址为acrobat@email.com 的用户也存在时,LIKE '%at@email.com%' 将会匹配它们。

【讨论】:

  • 感谢您的回答,我现在就试试!基本上 c_emails 字段保存由“|”分隔的质疑电子邮件或电话号码字符串,例如“joe@example.com|328913|32930123|mark@example.com”。这就是为什么我使用 like 和 username 保存团队表中存在的用户的电子邮件地址的原因。
  • 啊,完美,比预期的要容易 ;) 对于 c_email,我建议将它们存储为 "|aaa|bbbb|"(在第一个和最后一个之前加上 |),这样你就可以像 @ 987654330@(| 可能是一个特殊字符,在这种情况下你需要'%\|email\|%'
  • 嘿好主意 ;) 因为这样在选择时不会重复用户名!
猜你喜欢
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
相关资源
最近更新 更多