【问题标题】:Query two tables for different/separate values查询两个表以获取不同/单独的值
【发布时间】:2012-08-17 20:09:39
【问题描述】:

我有两张桌子:

任务
id name dueDate 完成项目ID

项目
id 名称到期日期完成

我需要在两个表中查询具有相同数据的行。我尝试做一个示例语句,只查找已完成 = 0 的行,但从未得到任何结果。我认为这与使用 OR 而不是 AND 有关,但它现在只是略高于我的水平......有什么想法吗?

澄清一下,我不是在寻找重复的行,而是在寻找“所有已完成 = 0 的任务和项目”

查询是:

SELECT * FROM "task" t, "project" p WHERE t.dueDate = "2012-08-17" OR p.dueDate = "2012-08-17" AND t.completed = 0 OR p.completed = 0

我确实设法让其中一个答案的代码起作用,但是我意识到我的整个应用程序都是为与一个表对话而编写的,并且将任务表和项目表结合起来并使用isProject 用于区分项目和任务的列。这也增加了在项目中嵌套项目的能力,因为项目现在也将有一个 projectID 列。

最终,KISS 占了上风……

感谢大家的帮助!我会标记有效的答案,即使我不会使用它。

【问题讨论】:

  • 您可以发布您尝试过的查询吗?
  • SELECT * FROM "task" t, "project" p WHERE t.dueDate = "2012-08-17" OR p.dueDate = "2012-08-17" AND t.completed = 0 OR p.completed = 0
  • 你能发布一些示例数据和预期结果吗?
  • 使用" 作为表标识符似乎很奇怪。您确定不打算改用 ` 吗?

标签: php mysql


【解决方案1】:

尝试使用括号。

SELECT * FROM "task" t, "project" p WHERE (t.dueDate = "2012-08-17" OR p.dueDate = "2012-08-17") AND (t.completed = 0 OR p.completed = 0)

【讨论】:

  • phpmyadmin: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"task" t, "project" p WHERE (t.dueDate = "2012-08-17" OR p.dueDate = "2012-08-17' at line 1
  • 是的,赞恩说的……对不起。这就是我复制和粘贴所得到的。
【解决方案2】:

如果您只希望两个表中的值与 dueDate='2012-08-17' 中的 completed=0 匹配:

您可以使用 join 将表结果绑定为一个。 内连接将只返回双方都匹配的结果。 因此,您可以使用它在两个表中匹配它们,然后通过经典 where 过滤您想要的值:

select * from task t inner join project p on t.dueDate = p.dueDate and t.completed = p.completed
where t.dueDate = '2012-08-17' and t.completed = 0

【讨论】:

  • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“inner join project p on t.dueDate = p.dueDate and t.completed = p.completed wher”附近使用正确的语法
【解决方案3】:

试试这个:

SELECT dueDate, completed
FROM task AS t 
WHERE (dueDate = "2012-08-17" AND completed = 0)
UNION ALL
SELECT dueDate, completed
FROM project AS p
WHERE (dueDate = "2012-08-17" AND completed = 0)

这应该为您提供dueDate = "2012-08-17"completed = 0 所在的每个表中的所有记录。

【讨论】:

  • 这行得通!现在要弄清楚如何更改此代码以做出该声明...呃:$where = '(t.'.$range.' OR p.'.$range.') AND (t.'.$status.' OR p.'.$status.')';
  • 如果我取出列(dueDate,已完成)并仅使用 * 来处理我现有的准备好的语句,这会起作用吗? edit刚刚尝试使用*s,得到#1222 - The used SELECT statements have a different number of columns
  • 试一试也无妨!我认为两个表之间的列需要在查询中重叠,但我可能错了。
  • 好的,所以它按原样工作,但是它不会返回整行,它只返回dueDate 并完成。不知道如何调整,除了在 SELECT 语句之后添加我需要的其他列
猜你喜欢
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 2018-10-10
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
相关资源
最近更新 更多