加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何获取类似项目的列表

发布时间:2020-12-13 16:03:48 所属栏目:PHP教程 来源:网络整理
导读:我有4张桌子: 项目 +----+------+---------+-----+| id | name | city_id | ... |+----+------+---------+-----+ 属性 +----+------+-----+| id | name | ... |+----+------+-----+ item_attribute +----+---------+--------------+| id | item_id | attrib
我有4张桌子:

项目

+----+------+---------+-----+
| id | name | city_id | ... |
+----+------+---------+-----+

属性

+----+------+-----+
| id | name | ... |
+----+------+-----+

item_attribute

+----+---------+--------------+
| id | item_id | attribute_id |
+----+---------+--------------+

+----+------+-----+
| id | name | ... |
+----+------+-----+

项目和属性具有多对多关系.

物品仅位于一对多的城市中

题:

我正在使用php(Laravel).如何在一个城市中为一个具有相似属性的项目获取项目列表(带LIMIT)?属性列表永远不等于2个项目.

是否可以使用MySQL查询?

例:

| ItemName | Attributes            | City |
+----------+-----------------------+------+
| Alpha    | one,two,three,four | NY   |
| Beta     | five,six,seven      | NY   |
| Gamma    | one,seven     | NY   |
| Delta    | one,eight       | CA   |
| Epsilon  | two,four      | NY   |
| Zeta     | ten,nine             | NY   |

我想为Alpha选择类似的项目,它们将是:Gamma,Epsilon,因为它们具有相似的属性.

Delta将不会被选中,因为它位于另一个城市.

解决方法

如果你同时传入了item_id和city_id:

SELECT i.name,GROUP_CONCAT(a.name) attributes,c.name
     FROM items i
     JOIN city c
       ON c.id = i.city_id
     JOIN item_attribute ia
       ON ia.item_id = i.id
      AND EXISTS (
       SELECT 1 
         FROM item_attribute ia1 
         JOIN item_attribute ia2
           ON ia2.attribute_id = ia1.attribute_id
          AND ia2.item_id = ia.item_id
        WHERE ia1.item_id = :item_id /* Pass in item id variable */
              )
     JOIN attributes a
       ON a.id = ia.attribute_id
    WHERE i.city_id = :city_id /* Pass in city id variable */
 GROUP BY i.name,c.name

如果你只是想传递示例项id :(有点草率,但应该工作)

SELECT i.name,c.name
     FROM items base
     JOIN items i
       ON i.city_id = base.city_id
     JOIN city c
       ON c.id = i.city_id
     JOIN item_attribute ia
       ON ia.item_id = i.id
      AND EXISTS (
       SELECT 1 
         FROM item_attribute ia1 
         JOIN item_attribute ia2
           ON ia2.attribute_id = ia1.attribute_id
          AND ia2.item_id = ia.item_id
        WHERE ia1.item_id = base.id
              )
     JOIN attributes a
       ON a.id = ia.attribute_id
    WHERE base.id = :item_id /* Pass in item id variable */
 GROUP BY i.name,c.name

**更新**

排序:

... 
JOIN (
       SELECT ia2.item_id,COUNT(*) count 
         FROM item_attribute ia1 
         JOIN item_attribute ia2
           ON ia2.attribute_id = ia1.attribute_id
          AND ia2.item_id = ia1.item_id
       /* AND ia2.id != ia1.id /* If you don't want the original item */
        WHERE ia1.item_id = base.id
     GROUP BY ia2.item_id
     ) similar
  ON similar.id = ia.item_id
 ...
ORDER BY similar.count DESC

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读