Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

bandingkan kumpulan data dan kembalikan kecocokan terbaik

Akan membantu jika Anda menunjukkan kepada kami struktur tabel Anda, jadi saya bisa lebih spesifik.

Saya berasumsi Anda memiliki struktur yang menyerupai ini:

Table item: (id, itemname)
1 item1
2 item2
3 item3
4 item4
5 item5

Table tag: (id, tagname)
1 cool
2 red
3 car

Table itemtag: (id, itemid, tagid)
1 1 2 (=item1, red)
2 2 1 (=item2, cool)
3 2 3 (=item2, car)
4 3 1 (=item3, cool)
5 3 2 (=item3, red)
6 3 3 (=item3, car)
7 4 3 (=item3, car)
8 5 3 (=item3, car)

Secara umum pendekatan saya adalah memulai dengan menghitung setiap tag terpisah.

-- make a list of how often a tag was used:
select tagid, count(*) as `tagscore` from itemtag group by tagid

Ini menunjukkan baris untuk setiap tag yang ditetapkan ke item, dengan skor.

Dalam contoh kita, itu adalah:

tag  tagscore
1    2         (cool, 2x)
2    2         (red, 2x)
3    4         (car, 4x)


set @ItemOfInterest=2;

select
  itemname,
  sum(tagscore) as `totaltagscore`,
  GROUP_CONCAT(tags) as `tags`
from
  itemtag
join item on itemtag.itemid=item.id

join
  /* join the query from above (scores per tag) */
  (select tagid, count(*) as `tagscore` from itemtag group by tagid ) as `TagScores`
  on `TagScores`.tagid=itemtag.tagid
where
  itemid<>@ItemOfInterest and 
  /* get the taglist of the current item */
  tagid in (select distinct tagid from itemtag where [email protected])
group by
  itemid
order by
  2 desc

Penjelasan:Kueri memiliki 2 subkueri:Salah satunya adalah untuk mendapatkan tag daftar dari item yang diminati. Kami hanya ingin bekerja dengan itu. Subkueri lainnya menghasilkan daftar skor per tag.

Jadi pada akhirnya, setiap item dalam database memiliki daftar skor tag. Skor tersebut dijumlahkan dengan sum(tagscore) , dan angka tersebut digunakan untuk mengurutkan hasil (skor tertinggi di atas).

Untuk menampilkan daftar tag yang tersedia, saya telah menggunakan GROUP_CONCAT.

Kueri akan menghasilkan sesuatu seperti ini (Saya telah membuat data aktual di sini):

Item   TagsScore   Tags
item3  15          red,cool,car
item4   7          red,car
item5   7          red
item1   5          car
item6   5          car 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mariadb - Setiap batch waktu eksekusi insert yang diperpanjang meningkat secara bertahap

  2. Aman dari Injeksi SQL - PDO, mysqli

  3. MySQL QUERY LIKE tidak menghasilkan apa-apa

  4. Bagaimana meningkatkan urutan berdasarkan kinerja dengan bergabung di mysql

  5. Apakah mungkin menggunakan klausa WHERE untuk memilih semua catatan dalam Pernyataan SQL?