【问题标题】:SQL: Selecting IDs that don't have any rows with a certain value for a columnSQL:为列选择没有具有特定值的任何行的 ID
【发布时间】:2019-09-25 20:13:12
【问题描述】:

我想选择没有任何 VAL = 'current' 的行的不同 ID(与多行相关联)。

例如,在这样的表中:

PK | ID | VAL 
-------------
 1 | 23 | deleted
 2 | 23 | deleted
 3 | 23 | deleted
 4 | 45 | current
 5 | 45 | deleted
 6 | 45 | deleted
...|................

我希望它返回 ID 23,因为它没有 VAL='current' 的行。请注意,在此表中,主键 (PK) 是唯一的,但 ID 不是唯一的(因此需要使用 DISTINCT 或 GROUP BY)。

这是我在 PHP 中所拥有的:

$conn = someConnect("");

// returns ids associated with the number of rows they have where VAL != 'current'
$sql = "SELECT id, count(*) FROM table WHERE val != 'current' GROUP BY id"

$stid = oci_parse($conn, $sql);
oci_execute($stid);

oci_fetch_all($stid, $arr, OCI_FETCHSTATEMENT_BY_ROW);

foreach ($arr as $elm) {
   $id = key($elm);
   $non_current_count = $elm[$id];

   // counts the number of rows associated with the id, which includes VAL = 'current' rows
   $sql2 = "SELECT count(*) FROM table WHERE id = $id";

   $stid2 = oci_parse($conn, $sql2);
   oci_execute($stid2);
   $total_count = oci_fetch_array...
   if ($total_count != $non_current_count) {
      $output[] = $id;
   } 
   ...
}

oci_close($conn);

这就是它的一般要点。如您所见,完成此任务需要两条 SQL 语句。有没有更短的方法?

【问题讨论】:

  • 你想要的输出是什么
  • 我想选择所有没有与之关联的行的 ID,其中 VAL = 'current'。
  • 您使用的是哪个 DBMS?

标签: php sql


【解决方案1】:
SELECT DISTINCT id
FROM table
WHERE id NOT IN (SELECT id
                 FROM table
                 WHERE val = 'current')

或:

SELECT a.id
FROM table a
LEFT JOIN table b ON a.id = b.id AND b.val = 'current'
WHERE b.id IS NULL

【讨论】:

  • 哇,没想到这么简单。谢谢!
【解决方案2】:

你可以使用有

SELECT
    id,
    count(*) as Total
FROM table
WHERE val <> 'current'
HAVING Total > 0

输出

| ID | TOTAL |
|----|-------|
| 23 |     5 |  

Fiddle

【讨论】:

    【解决方案3】:

    如果你想使用从句,那么就这样使用

    SELECT
        id,
        count(*) as Total
    FROM Status S1
    WHERE val <> 'current'
    GROUP BY id
    HAVING count(*) = (SELECT COUNT(*) FROM Status S2 WHERE S2.id = S1.id)
    

    【讨论】:

      猜你喜欢
      • 2021-07-29
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 2021-12-11
      • 2022-01-17
      • 2020-12-01
      相关资源
      最近更新 更多