【发布时间】:2011-05-11 17:43:02
【问题描述】:
好的,我们开始...我有一个选择查询访问一个非常抽象数据库。我当前的查询会查看 5 个表(使用 6 个“AND”来完成...不好玩)并返回符合所有条件的任何记录。
我的问题是:我能否在当前查询中添加一些内容,基本上是“如果记录匹配所有这些,但不匹配所有这些” .
示例:
我当前的查询:
$query = "SELECT s.state_name FROM `tbl_records` r, `tbl_states` s,
`tbl_events` e, `tbl_fields` f, `tbl_field_values` v
WHERE s.state_id = r.state_id AND f.field_id = '$field_id' AND
v.field_id = f.field_id AND v.event_id = e.event_id AND e.record_id = r.record_id
AND v.value_id = '$field_value' AND v.is_latest = '1'";
又丑又长,对吧?好吧,这给了我所有符合 一个 条件的记录(记录匹配 $field_id 和 $field_value)。
现在我需要获取此查询找到的所有记录,但减去任何符合其他条件的记录,例如“AND (v.event_id = e.event_id AND f.field_id = '155' AND v.value_id != '1');
那是又长又丑的版本。 总结:
我需要创建一个类似于以下内容的查询:Select "s.state_name FROM a,b,c,d WHERE (a.1 = b.2 AND c.3 = d.4 *etc*) AND ONLY IF (a.2 = b.3 AND c.4 != d.5)"
这可能吗?您能否创建查询“如果匹配所有这些并且不匹配所有这些”?
如果有人需要更多说明,请告诉我...这不会让我感到惊讶。谢谢你们。
更新:: 添加图片以尝试说明我需要什么。
table structure http://www.everythingsirie.com/values.jpg
“需要添加”下的两个值需要属于同一条记录。所以在计划英语中“对于同一条记录,在表 'tbl_field_values' 中,如果记录的 'field_id' 为 '155' 且 field_value 为 '1',则不要包含它。”
但请注意,现在有 两个 field_id 和 value_id。这就是让我难过的地方......
更新 2::
我已使用来自@M42 和@Michael 的答案更新了查询。但是,无论有没有“AND NOT”,我仍然得到相同数量的退货......
$query = "SELECT s.state_name FROM `tbl_records` r
INNER JOIN `tbl_states` s ON s.state_id = r.state_id
INNER JOIN `tbl_events` e ON e.record_id = r.record_id
INNER JOIN `tbl_field_values` v ON v.event_id = e.event_id
INNER JOIN `tbl_fields` f ON v.field_id = f.field_id
WHERE f.field_id = '$field_id'
AND v.value_id = '$field_value'
AND v.is_latest = '1'
AND NOT (v.field_id = '155' AND v.value_id = '1')";
我认为问题在于我需要不匹配的 field_id 和 value_id 与我 DO 需要匹配的 field_id 和 value_id 位于同一个表中。这是一张显示 field_id 为 155 且 value_id 为 1 和 0 的图片。
我不需要包含 value_id 为 1 的记录,仅当 field_id 为 155 时...但同时我 AM 尝试选择 field_id=12 和 value_id= 的记录1...
table structure http://www.everythingsirie.com/valueid.jpg
我知道这是一团糟......对不起。
【问题讨论】:
-
这与在
WHERE子句中添加更多AND语句有何不同? -
解雇数据库管理员。这就是我要开始的地方。
-
第一个查询是寻找任何匹配一个field_id的记录,但我需要减去匹配不同field_id的记录以及 不匹配另一个字段
-
@Caleb,我支持@Matthew。我看不出您的请求有什么不同,并在声明中添加了更多
AND。与其直接问问题,不如提供一个示例数据结构和数据可以回答的问题,例如“我怎样才能获得这种状态下的所有事件?” -
很公平。让我看看我能把什么放在一起