我有一个名人照片网站,10万张照片并且还在增长。用户已经搜索了“奥斯卡颁奖典礼”,目前我正在浏览结果以显示相关照片。
现在,我想提供一个搜索优化列,它位于结果旁边,将显示在该特定事件中拍摄的人物的特定名称(基于结果中的photoID),显示照片数量接下来每个名称,并按最高数量的顺序显示名称。
像这样:
您搜索过:“奥斯卡颁奖典礼”(12,489)
特定人群:
布拉德皮特(1,726)Angelina Jolie(1,302)
爱德华诺顿(929)......这是我的数据库架构:
photoSearch (tbl) photoID INT(11) Index Auto-Increment headline VarChar(1000) FullText caption VarChar(2500) FullText dateCreated DateTime Index photoPeople (tbl) photoID INT(11) peopleID INT(11) people (tbl) peopleID INT(11) Primary Auto-Increment people VarChar(255) Index
基本上,我有一个来自用户上次搜索的photoID结果集。使用该结果集,我需要查询“photoPeople”和“people”表,列出与这些photoID相关的人员,我需要显示数量并按数量订购。
我该怎么做呢?可以在一个查询中完成吗?我是否必须将结果写入表中才能计算和排序?
这是我到目前为止所做的,但只列出了人名:
SELECT * FROM people INNER JOIN photopeople ON photoPeople.peopleID = people.PeopleID WHERE photoID IN ('87345','8900','83458','63746')
我不是在寻找确切的代码,虽然它会非常有用,但我只是在寻找有关如何正确实现这一目标的建议。我认为我的大脑能够展示相关人员,但不是以任何顺序,当然也没有计算!
感激不尽的任何帮助......
P.S。当我得到一个有效的解决方案时,我会将它应用到我的事件表和关键字中。这意味着如果有人搜索“布拉德皮特”,“奥斯卡颁奖典礼”活动将出现在“精确搜索”专栏中,旁边有1,726个活动。
答案 0 :(得分:2)
如果我理解你的架构,这应该有效:
SELECT people.People AS Name, count(*) AS NumberOfPhotos
FROM people
INNER JOIN photoPeople ON photoPeople.peopleID = people.PeopleID
WHERE photoPeople.photoID IN ('87345','8900','83458','63746')
GROUP BY photoPeople.PeopleID, people.People
ORDER BY NumberOfPhotos DESC
(抱歉,我对MSSQL更熟悉,但我认为MySql非常相似)
答案 1 :(得分:0)
这是在sql查询之外,但是看看solr和faceting ......你可以进行搜索,然后通过facet进行优化。您还可以获得自动完成,拼写检查和词干等整洁功能。