Bir sütun varsa belirli satırlar veya bir sütun yoksa tüm satırlar nasıl seçilir


23

Birkaç tablo için satır sayısını belirten bir komut dosyası yazıyorum, ancak bazı tablolar için yalnızca bir bayrak ayarlandığı satır sayısını almak istiyorum (bu durumda etkin = 1). Bunu bir sorguda yapabilmemin bir yolu var mı?

Örneğin:

Tablo usersaktif olarak adlandırılan bir sütuna sahiptir

Tabloda clientsaktif denilen bir sütun yoktur.

Aktif olan = 1 olan kullanıcıları ve sadece bir müşteri sayısını almak istiyorum.

Demeden önce "sadece zor kod" Bu sayısız farklı veritabanları üzerinde çalışan edilebilecek bir piton komut dosyası içine gidiyor bir sorgu ve benim komut seçme ve onlar bir sütun varsa çağrılan ne olacağını tabloları bilmenin bir yolu var active, ve İki ayrı bir tane yerine hepsini yapmak için tek bir sorgu almayı tercih ediyorum ve bir hata atmak için mysql'e dayanarak diğerini kullandım.


Bir müşteriye referansta bulunan bir müşteri kimliği var
Matt S.

Yanıtlar:


50

Benim ilk düşüncem ilkini kullanmak olacaktır INFORMATION_SCHEMA, böylece hangi tabloların bir activesütuna sahip olduğunu (MySQL örneğindeki tüm tablolar için tek bir sorguda) hangi tabloların bir sütuna sahip olduğunu ve ardından sorgularınızı oluşturmak için bu bilgiyi kullandığınızı öğreneceksiniz . Ve bu muhtemelen en akıllıca yaklaşımdır.

Tablonun böyle bir sütunu olup olmadığına bakılmaksızın işe yarayan başka bir zor yol var.

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

SQL-Fiddle'da test edildi Nasıl çalışıyor?

Tablonun adında bir sütunu varsa, activesorgu, aşağıdaki gibi "çevrilir":

    WHERE t.active = 1

Tablonun adında bir sütunu yoksa active, sorgu, aşağıdaki gibi "çevrilir":

    WHERE dummy.active = 1         -- which is true 

3

Yalnızca userstabloyu kullanarak Kullanıcı Toplam Başına İstemci Sayısı :

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

İstemciler tablosu kayıtları silmişse, bunu yapın:

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;

İçin userstablolar bir yok activesütun:

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

veya

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;

Bu sorguları her veritabanına ve UNION ALLsonuçlara karşı çalıştırmanız gerekir .

INFORMATION_SCHEMA veritabanını kullanmak istiyorsanız, o zaman burada vahşi bir tahmin:

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;

Bir şans ver !!!


1

@ Ypercubeᵀᴹ'ün cevabını eklemek isterim, ancak kısıtlamalar nedeniyle yorum yazamam.

Hangi sütun adının kullanıldığını bilmiyorsanız ve maksimum değerini almanız gerekiyorsa, şunu yapabilirsiniz:

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.