MySQL boş olmayan alanların sayısını

3 Cevap php

Ben onlar (dört) diğer kullanıcılara mesaj gönderebilir ve gönderilen mesajın kimliği kendi kullanıcı satırda olan kullanıcıların bir veritabanı var.

Name    | Email       | Msg1 | Msg2 | Msg3 | Msg4
--------+-------------+------+------+------+-----
Pez     | me@me.com   |  1   |  55  |  42  |  5 
Steve   | fake@me.com |  0   |   0  |   0  |  0 
Leon    | josh@me.com |  3   |   0  |   3  |  5 

Nasıl bir MySQL sorguda bana o kadar sipariş için izin 0'a eşit boş değilseniz veya bu mesajı satır miktarda alabilirsiniz? Bu yüzden dönecekti

Pez   | 4 Mesasges
Leon  | 3 Messages
Steve | 0 Messages

Aklımı im gibi bir şey:

order by count(!empty(msg1)+!empty(msg2)+!empty(msg3)+!empty(msg4)) 

3 Cevap

Ile normalized tables o kadar basit olabilir

SELECT Count(*) FROM messages WHERE userid=47

Ama şema gibi bir şey deneyin

SELECT
  name,
  (msg1<>0) + (msg2<>0) + (msg3<>0) + (msg4<>0) as cMessages
FROM
  foo  

edit: if() bir karşılaştırmanın sonucu 0 olarak yanlış ve 1 gerçek olarak kullanmak için MySQL'in davranış dayanmaz kullanarak Vincent Ramdhanie cevabı. Ben bunu tercih ederim.

Aşağıdaki gibi iyi bahis normalize your database olacaktır:

Table users:    (user_id, name, email)
Table messages: (user_id, msg_number, msg_code)

messages table (user_id, msg_number) bir bileşik birincil anahtar olurdu süre users masa, user_id birincil anahtar olarak olurdu. msg_number alan 1-4 mesaj numarasını (eğer sütun adları temsil sayısı) temsil edecek.

Bileşik birincil anahtar her kullanıcı sadece her msg_number için bir mesaj olabilir garanti ederim. Ayrıca check constraint, böylece oluşturmak isteyebilirsiniz msg_number her zaman <= 4. Sonunda {[(4) içinde user_id tanımlamak isteyebilirsiniz a foreign key users tablo olarak]} tablo.

Bir kullanıcının mesaj göndermek olmasaydı, sen msg_code = 0 ile mesaj tablosunda bir satır yok gerektiğini unutmayın. Bunun yerine, satır atlamak gerekir.

: Normalize tabloları ile, her kullanıcı için mesajların sayısını sayma kadar kolay olurdu

SELECT    u.name, COUNT(m.msg_number) as num_of_messages
FROM      users u
JOIN      messages m ON (m.user_id = u.user_id)
GROUP BY  u.user_id;

Diğerleri söylediler sorunu çözmek için doğru yolu veritabanı normalleştirmek için.

Sen akım şemasından sayar alabilirsiniz - ama onun biraz dağınık:

SELECT name, (SIGN(msg1)+SIGN(msg2)+SIGN(msg3)+SIGN(msg4))
FROM yourtable
ORDER BY (SIGN(msg1)+SIGN(msg2)+SIGN(msg3)+SIGN(msg4)) DESC;

C.