열이 있으면 특정 행을 선택하거나 열이 없으면 모든 행을 선택하는 방법


23

몇 테이블의 행 수를 얻는 스크립트를 작성하고 있지만 일부 테이블의 경우 플래그가 설정된 행 수 (이 경우 active = 1) 만 가져 오려고합니다. 한 번의 쿼리 로이 작업을 수행 할 수있는 방법이 있습니까?

예 :

테이블에 usersactive라는 열이 있습니다.

테이블에 clientsactive라는 열이 없습니다.

active = 1 인 사용자 수를 얻고 클라이언트 수를 얻고 싶습니다.

당신이 말을하기 전에 "단지 하드 코드는"이것은 많은 다른 데이터베이스에서 실행할 수있는 파이썬 스크립트 내에서 일어나고 쿼리 만 내 스크립트를 선택하고 그들이 열이있는 경우 호출됩니다 어떤 테이블 알 방법이 없습니다 active, 및 두 개의 별도 쿼리 대신 모든 쿼리를 수행하고 mysql을 사용하여 오류를 발생시키는 다른 쿼리를 사용하는 것을 선호합니다.


클라이언트에 클라이언트를 참조하는 클라이언트 ID가 있습니다
Matt S.

답변:


50

내 첫 번째 생각은 첫 번째 것을 사용하는 INFORMATION_SCHEMA것이므로 MySQL 인스턴스의 모든 테이블에 대한 하나의 쿼리에서 active열 이있는 테이블을 알고 그 정보를 사용하여 쿼리를 구성합니다. 그리고 이것은 아마도 가장 건전한 접근법 일 것입니다.

테이블에 이러한 열이 있는지 여부에 관계없이 작동하는 까다로운 방법이 있습니다.

SELECT 
  ( SELECT COUNT(*)
    FROM TableName AS t
    WHERE active = 1
  ) AS cnt
FROM
  ( SELECT 1 AS active
  ) AS dummy ;

SQL-Fiddle 에서 테스트 어떻게 작동합니까?

테이블에이라는 열이 있으면 active쿼리는 다음과 같이 "번역"됩니다.

    WHERE t.active = 1

테이블에이라는 열이 없으면 active쿼리는 다음과 같이 "번역"됩니다.

    WHERE dummy.active = 1         -- which is true 

3

만을 사용하여 총계와 사용자 ID 당 클라이언트의 개수 users테이블 :

SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(u.clientid) ClientCount
FROM users u
WHERE u.active = 1
GROUP BY u.id WITH ROLLUP;

clients 테이블이 레코드를 삭제 한 경우 다음을 수행하십시오.

SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(c.id) ClientCount
FROM users u INNER JOIN clients c
ON u.clientid = c.id
WHERE u.active = 1
GROUP BY u.id WITH ROLLUP;

들어 users테이블하지 않아도 active열을 :

SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(u.clientid) ClientCount
FROM users u
GROUP BY u.id WITH ROLLUP;

또는

SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(c.id) ClientCount
FROM users u INNER JOIN clients c
ON u.clientid = c.id
GROUP BY u.id WITH ROLLUP;

각 데이터베이스와 UNION ALL결과 에 대해 이러한 쿼리를 실행해야 합니다.

INFORMATION_SCHEMA 데이터베이스를 활용하려면 다음과 같이 추측하십시오.

SELECT COUNT(1) INTO @hasactive
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'users'
AND column_name = 'active';
SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(u.clientid) ClientCount
FROM users u
WHERE IF(@hasactive=1,u.active=1,1)=1
GROUP BY u.id WITH ROLLUP;

시도 해봐 !!!


1

@ ypercubeᵀᴹ의 답변을 보완하고 싶지만 제한 사항 때문에 의견을 쓸 수 없습니다.

사용되는 열 이름을 모르고 최대 값을 가져와야 할 경우 다음을 수행 할 수 있습니다.

SELECT
    ( SELECT
          max(ISNULL(updateTime, null)) + max(ISNULL(updDT, null))
          FROM tableName as t
    ) AS maxUpdateDT
FROM (SELECT 0 AS updateTime, 0 as updDT) AS dummy;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.