php项目列表,php – 如何获取类似项目的列表
我有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, three, seven | NY |
| Delta | one, six, eight | CA |
| Epsilon | two, three, 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,
GROUP_CONCAT(a.name) attributes,
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
總結
以上是生活随笔為你收集整理的php项目列表,php – 如何获取类似项目的列表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ElasticSearch前缀匹配查询(
- 下一篇: php文件域的作用,PHP作用域和文件夹