Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

so sánh các tập dữ liệu và trả về kết quả phù hợp nhất

Sẽ hữu ích nếu bạn cho chúng tôi xem cấu trúc bảng của bạn, vì vậy tôi có thể nói cụ thể hơn.

Tôi giả sử bạn có cấu trúc giống như sau:

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)

Nói chung, cách tiếp cận của tôi sẽ là bắt đầu bằng cách đếm từng thẻ riêng biệt.

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

Điều này hiển thị một hàng cho mỗi thẻ đã được chỉ định cho mặt hàng, với một điểm số.

Trong ví dụ của chúng tôi, đó sẽ là:

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

Giải thích:Truy vấn có 2 truy vấn con:Một là lấy các thẻ danh sách từ mục quan tâm. Chúng tôi chỉ muốn làm việc với những truy vấn đó. Truy vấn con khác tạo ra một danh sách điểm cho mỗi thẻ.

Vì vậy, cuối cùng, mỗi mục trong cơ sở dữ liệu có một danh sách các điểm thẻ. Những điểm số đó được cộng lại với sum(tagscore) , và số đó được sử dụng để sắp xếp kết quả (điểm cao nhất ở trên cùng).

Để hiển thị danh sách các thẻ có sẵn, tôi đã sử dụng GROUP_CONCAT.

Truy vấn sẽ dẫn đến kết quả như thế này (Tôi đã tạo dữ liệu thực tế ở đây):

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. CakePHP sử dụng nhiều cơ sở dữ liệu cho các mô hình

  2. truy xuất giá trị bài đăng từ biểu mẫu có tên phần tử động

  3. Nếu một giao dịch PHP PDO không thành công, tôi có phải rollback () một cách rõ ràng không?

  4. Truy vấn SUM cho hai trường trong hai bảng khác nhau

  5. Không thể khôi phục bản sao lưu MYSQL vào Cơ sở dữ liệu mới