Mysql: Virgül Kont Beğen ile Ayrılmış Değerler Başlarken

4 Cevap php

Ben gönderen, url, içerik vb ile mesaj tablosunda da bir favs sütunda bir virgülle ayrılmış bir liste olarak favs (favori olarak o yazıyı işaretlenmiş kullanıcıların id) kullanmaya karar verdi.

Ama böyle bir quey olan satırları saymak çalıştığınızda:

tüm id Başka bir Sitesinden bir parçası olabilir, çünkü '% kimliği%' gibi favs elbette yanlış sonuçlar verir mesajlardan count (id) seçin

Örneğin id = 1 için sorgulama sırasında aynı zamanda kullanıcı kimliği 11 ile favorited herhangi diğer içerikler için sayacını artırmak ...

Bu sistem iş yapmak için bana fikir ya da herhangi bir çözüm söyleyebilir misiniz?

4 Cevap

Birkaç ya da yıllardan ile, çirkin bir çözüm olabilir:

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

Orada daha zarif bir çözüm olasıdır, ama bu bir en azından aradığınız sonuç dönecektir, ben inanıyorum.

Kullanıcılar ve sevdikleri mesajlar arasındaki ilişki yerine başka bir tabloda depolanan veri modeli gibi değiştirmek mümkün mü?

Tek bir sütunda dernekler saklanması bir ilişkisel veritabanı avantajlarını ortadan kaldırmaktadır. Eğer artık ilişki hakkında ek veri saklayabilir, gibi işlevini kullanarak bir performans maliyet ödemek ve veri sorgulamak zordur.

Alternatif bir model bu gibi bir şey arıyor (ben yeni bir kullanıcı değilim, ama ben bir yapılan bu yana bir görüntü bulunur here olamaz) içerebilir:

users
 - id

messages
 - id

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

Yerine o ile, orijinal sorgu aşağıdaki basitleştirilmiş olacaktır:

select count(1) from favorite_messages where user_id = userid

Ayrıca, bir kullanıcının favori iletilerin bir listesini almak gibi şeyler yapabilirsiniz:

select 
    * 
from 
    messages 
    inner join favorite_messages 
    	on messages.id = favorite_messages.message_id
where
    user_id = userid

Bu kullanarak yapmalıdır:

SELECT count(id) FROM messages WHERE FIND_IN_SET('userid',favs) > 0

Sen, değerini almak PHP ile patlayabilir ve sonra dizi saymak zorunda kalabilirsiniz.

Orada MySQL bunu yapmak için yolu vardır, ama ben ne gördüm, onlar bir güçlük vardır.