2016-04-11 22 views
0

I'am gruplama karışımı: (tablo A artan, masa B inen) MySQL Sorgusu - sıralama ve bir tablodan şu bilgileri almaya çalışırken

  • tüm "u

    • "b" göre sıralama "belirli bir değerle ilk önce (bu örnekte, u = 3) görünür - o zaman sipariş önemli değil
    • N (NULL) her zaman sonunda
    • iki kez (ancak tüm farklı" r "oluşabilir olması gerekir)

    "ORDER BY IFNULL (u, 99999999)! = 3, u, b" kriteri 1, 2 ve 3 çalışır, ancak son olarak, hiçbir fikrim yok.

    DISTINCT ile GROUP BY'de olduğu gibi hedefe ulaşamıyorum.

    Herkesin bir fikri var mı? Çok teşekkürler şimdiden.

    start table   target table A 
    +----------------+ +----------------+ 
    | id | r | u | b | | id | r | u | b | 
    +----------------+ +----------------+ 
    | 1 | 1 | 1 | 9 | | 18 | 5 | 3 | 1 | 
    | 2 | 1 | 3 | 4 | | 2 | 1 | 3 | 4 | 
    | 3 | 1 | 4 | 6 | | 15 | 4 | 3 | 7 | 
    | 4 | 1 | 5 | 5 | | 11 | 3 | 3 | 8 | 
    | 5 | 2 | 1 | 2 | | * | 2 | * | * | 
    | 6 | 2 | 2 | 1 | | 21 | 6 | N | N | 
    | 7 | 2 | 4 | 5 | +----------------+ 
    | 8 | 2 | 5 | 7 | 
    | 9 | 3 | 1 | 4 | 
    | 10 | 3 | 2 | 3 | 
    | 11 | 3 | 3 | 8 | 
    | 12 | 3 | 5 | 2 | target table B 
    | 13 | 4 | 1 | 3 | +----------------+ 
    | 14 | 4 | 2 | 2 | | id | r | u | b | 
    | 15 | 4 | 3 | 7 | +----------------+ 
    | 16 | 4 | 4 | 6 | | 11 | 3 | 3 | 8 | 
    | 17 | 5 | 2 | 9 | | 15 | 4 | 3 | 7 | 
    | 18 | 5 | 3 | 1 | | 2 | 1 | 3 | 4 | 
    | 19 | 5 | 4 | 6 | | 18 | 5 | 3 | 1 | 
    | 20 | 5 | 5 | 4 | | * | 2 | * | * | 
    | 21 | 6 | N | N | | 21 | 6 | N | N | 
    +----------------+ +----------------+ 
    
  • +0

    nasıl 'R' sütun üzerinde daha sonra 2 değer olduğunda almayı hangi satırların seçerim? Ve ben seni anladığımdan emin değilim, 'targetT' ve' targetB' 'StartTable' çıktı? – sagi

    +1

    Kodunuzu gösterebilir misiniz? –

    +0

    başlangıç ​​tablosu db'deki tablo ve hedef çizelgeler benim istediğim sonuçlar – Seamanx

    cevap

    2
    SELECT * 
    FROM mytable m 
    WHERE id = 
         (
         SELECT id 
         FROM mytable mi 
         WHERE mi.r = m.r 
         ORDER BY 
           u IS NULL, u = 3 DESC, b, id 
         LIMIT 1 
         ) 
    ORDER BY 
         u IS NULL, u = 3 DESC, b 
    

    Güncelleme:

    SELECT * 
    FROM objects o 
    LEFT JOIN 
         ratings r 
    ON  r.id = COALESCE(
         (
         SELECT id 
         FROM ratings 
         WHERE object_id = o.id 
           AND user_id = :myuser 
         ORDER BY 
           rating DESC 
         LIMIT 1 
         ), 
         (
         SELECT id 
         FROM ratings 
         WHERE object_id = o.id 
         ORDER BY 
           rating DESC 
         LIMIT 1 
         ) 
         ) 
    
    +0

    Teşekkürler, bu işe yarıyor! – Seamanx

    +0

    Bu inşaat özel bir adı var mı? Bunu anlamak isterdim ama yapamam! – Seamanx

    +0

    @Seamanx: ilişkili alt sorguya inanıyorum. Diğer tüm büyük sistemlerde, pencere işlevi olan "ROW_NUMBER" harfini kullanmış olursunuz, ancak MySQL bunu desteklemez. – Quassnoi

    İlgili konular