Mysql: Mendapatkan Hitungan Nilai yang Dipisahkan Koma Dengan Suka

Saya memutuskan untuk menggunakan favs (id pengguna yang menandai postingan itu sebagai favorit) sebagai daftar yang dipisahkan koma di kolom favs yang juga ada di tabel pesan dengan pengirim, url, konten, dll.

Tetapi ketika saya mencoba menghitung baris-baris itu dengan pertanyaan seperti:

select count(id) 
from messages 
where favs like '%userid%' 

tentu saja ini memberikan hasil yang salah karena semua id mungkin merupakan bagian dari id lain

Misalnya saat menanyakan id=1 itu juga meningkatkan penghitung untuk konten lain yang difavoritkan oleh pengguna id 11...

Bisakah Anda memberi tahu saya ide Anda atau solusi apa pun agar sistem ini berfungsi?


person jnbn    schedule 30.04.2009    source sumber


Jawaban (4)


Dengan beberapa atau, Anda dapat memiliki solusi yang buruk:

select count(id) from messages where favs like 'userid,%' or favs like '%,userid,%' or favs like '%,userid'

Mungkin ada solusi yang lebih elegan, tetapi saya yakin solusi tersebut setidaknya akan memberikan hasil yang Anda cari.

person Warren Krewenki    schedule 30.04.2009

Apakah mungkin untuk mengubah model data Anda sehingga hubungan antara pengguna dan pesan favorit mereka disimpan di tabel lain?

Menyimpan asosiasi dalam satu kolom meniadakan keuntungan dari database relasional. Anda membayar biaya kinerja menggunakan fungsi serupa, Anda tidak dapat lagi menyimpan data tambahan tentang hubungan tersebut, dan data lebih sulit untuk dikueri.

Model alternatif mungkin terlihat seperti ini (tidak dapat menyertakan gambar karena saya pengguna baru, tapi saya membuatnya di sini):

users
 - id

messages
 - id

favorite_messages
 - user_id (foreign key to users.id)
 - message_id (foreign key to messages.id)

Dengan demikian, kueri awal Anda akan disederhanakan menjadi berikut:

select count(1) from favorite_messages where user_id = userid

Selain itu, Anda dapat melakukan hal-hal seperti mendapatkan daftar pesan favorit pengguna:

select 
    * 
from 
    messages 
    inner join favorite_messages 
        on messages.id = favorite_messages.message_id
where
    user_id = userid
person Jason Jones    schedule 30.04.2009

harus menggunakan ini:

SELECT count(id) FROM messages WHERE FIND_IN_SET('userid',favs) > 0
person Community    schedule 02.06.2009

Anda mungkin harus mendapatkan nilainya, meledakkannya dengan PHP dan kemudian menghitung arraynya.

Ada cara untuk melakukannya di MySQL, tapi dari apa yang saya lihat, itu merepotkan.

person alex    schedule 30.04.2009