我在查询中使用了几个表,并且它们都有一列deleted
,指示记录是否已被删除(0或1) 。我一直在做的是:当字段名称相同时检查表间的值
WHERE table1.deleted = 0 and table2.deleted = 0 and table3.deleted = 0)
我想知道是否有一种方式来表示整个表的相同的字段名称的值,如:
WHERE *.deleted = 0
以上没有工作,显然。这可以做到吗?
我在查询中使用了几个表,并且它们都有一列deleted
,指示记录是否已被删除(0或1) 。我一直在做的是:当字段名称相同时检查表间的值
WHERE table1.deleted = 0 and table2.deleted = 0 and table3.deleted = 0)
我想知道是否有一种方式来表示整个表的相同的字段名称的值,如:
WHERE *.deleted = 0
以上没有工作,显然。这可以做到吗?
无法完成。您需要像第一个示例中那样明确引用每列。
使用按位
或
和
WHERE (table1.deleted & table2.deleted & table3.deleted) = 0
参见:http://dev.mysql.com/doc/refman/5.5/en/bit-functions.html
或者更短:
WHERE NOT(table1.deleted & table2.deleted & table3.deleted)
免责声明
正如David理所当然地说,只是因为它可以被做不做它 一个好主意。
MySQL将无法在此查询中使用索引,因此此版本将比您的原始版本慢。
(轻微)句法缩短,代价是丢失索引' – 2011-06-09 19:04:53
@David,并不是说这是个好主意,但它可以完成。 – Johan 2011-06-09 20:10:12
根据我们的讨论,这里有一个潜在的解决方案。根据查询和子查询的数量,您将为每个引用的表编写需要tableX.deleted = 0
的查询和子查询,可能需要最短时间在这些表上设置视图。像这样为每个表:
CREATE VIEW table1deleted AS SELECT * FROM table1 WHERE deleted = 0;
然后在你的查询您table1deleted
而不是table1
选择,因为在table1deleted
意见中的所有项目都已经通过deleted = 0
过滤。
由于没有办法直接在SQL中执行此操作,因此请考虑将SQL表达式存储在外部文件中,并使用工具生成这些表达式,以便在宏中存储重复的表达式。或者你可以编写函数来生成你使用的任何语言的SQL。
像约翰建议的那样的技巧可能会降低性能,而你真正的目标是使SQL表达式更容易处理。所以解决方案是停止硬编码并以更复杂的方式处理它们。
你是如何构建查询的?硬编码或动态PHP或类似?另外,您正在查看的表名是否有模式?根据这些问题的答案,你可能会做你想做的事情 - 需要更多的信息。 – 2011-06-09 18:27:35
这是一个硬编码的查询。表名没有模式。基本上,我需要在外部查询和任何子查询的几乎每个连接和每个where子句中编写'table.deleted = 0',所以我希望有一种方法可以使它更加隐含。 – Anthony 2011-06-09 18:48:22
2年5个月后,请停止在标题中写标签。 – 2011-06-09 18:59:01