MySQL:通过公共标签匹配对象

时间:2016-03-30 22:42:45

标签: mysql sql match matching

我有以下表格结构:

var notif = UILocalNotification()
        notif.timeZone = NSTimeZone.defaultTimeZone()

        let morningOfChristmasComponents = NSDateComponents()
        morningOfChristmasComponents.year = 2016
        morningOfChristmasComponents.month = 03
        morningOfChristmasComponents.day = 30
        morningOfChristmasComponents.hour = 15
        morningOfChristmasComponents.minute = 59
        morningOfChristmasComponents.second = 0

        let morningOfChristmas = NSCalendar.currentCalendar().dateFromComponents(morningOfChristmasComponents)!

        let formatter = NSDateFormatter()
        formatter.dateStyle = NSDateFormatterStyle.LongStyle
        formatter.timeStyle = .MediumStyle

        let dateString = formatter.stringFromDate(morningOfChristmas)

        notif.fireDate = morningOfChristmas
        notif.alertBody = "alarma wolf"
        notif.userInfo = ["identificador": "wolf"]
        UIApplication.sharedApplication().scheduleLocalNotification(notif)
        print("alarma fijada para \(dateString)")

每个披萨以及订单都可以有多个标签。

问题是如何找到给定订单的最佳披萨(order_id)。更多"匹配"标签披萨和订单有,我们可以找到任何给定订单的更好的披萨。

我尝试了一些具有交叉和连接的不同SQL查询,但没有找到或多或少的快速查询来解决所描述的问题。

请告知。

2 个答案:

答案 0 :(得分:1)

这个想法是tag_id上两个标签表之间的连接。其余的只是聚合,过滤和计数。

select ot.order_id, count(*) as NumMatching
from order_tags ot join
     pizza_tags pt
     on ot.tag_id = pt.tag_id
where pt.pizza_id = @PIZZA_ID
group by ot.order_id
order by NumMatching desc;

答案 1 :(得分:1)

如果我正确理解了这个问题,你应该能够使用子查询完成此任务。像这样:

SELECT o.id, o.order_id, o.tag_id,
(SELECT COUNT(*) FROM pizza_tags AS p WHERE p.tag_id = o.tag_id) AS p_tags
FROM order_tags AS o
GROUP BY o.order_id, o.tag_id
ORDER BY p_tags DESC;

基本上,您获得的任何pizza_tags都与order_tags.tag_id匹配,并使用最相关的排序。{/ p>

我已经整理了一个最小的小提琴here