【问题标题】:Help with PHP Select Query: WHERE x=y AND a=b AND IF (c != d) Possible?帮助 PHP 选择查询:WHERE x=y AND a=b AND IF (c != d) 可能吗?
【发布时间】: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。与其直接问问题,不如提供一个示例数据结构和数据可以回答的问题,例如“我怎样才能获得这种状态下的所有事件?”
  • 很公平。让我看看我能把什么放在一起

标签: php mysql select phpquery


【解决方案1】:

据了解,您可以添加到您的查询中:

AND NOT (f.field_id = '155' AND v.value_id != '1')

【讨论】:

  • 出于某种原因,这仍然给了我相同数量的回报。不管有没有这个添加,我仍然会返回所有记录。这看起来是正确的做法,但在这种情况下我可能会错误地使用它......
  • 好的。所以我找到了一种方法来结合@Michael和@M42的答案。我最终通过在其中使用 AND NOT EXISTS 和完整的 SELECT 查询来获得它,如下所示:AND NOT EXISTS     (     SELECT *     FROM tbl_field_values v     INNER JOIN tbl_events e ON v.event_id = e.event_id     WHERE e.record_id = r.record_id     AND v.is_latest = 1     AND (v.field_id = 155 AND v.value_id = 1)     )"; 这对我来说太难了,如果没有大家的帮助,我无法做到。谢谢。
【解决方案2】:

您可以改为使用 INNER JOIN 来连接表。它们的作用与使用 WHERE 子句连接表相同,但看起来更好恕我直言……它不会弄乱您的 WHERE 子句。

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'

【讨论】:

  • 非常有助于保持清洁和更易于管理。谢谢!
【解决方案3】:

这里是更新 2:

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 = '12' AND v.value_id = '1')
  OR (v.field_id = '155' AND v.value_id != '1'))
  AND v.is_latest = '1'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2013-07-15
    • 1970-01-01
    相关资源
    最近更新 更多