2013-08-28 50 views
0

所以我有一个类似于这个https://stackoverflow.com/a/18462040/1768337的查询正如你所看到的,行已经按照喜欢排序。假设我使用上面链接中的sql语句创建一个索引。有没有一种方法可以准确输出这个sql语句给出的内容?也就是说,维护在sql语句中设置的顺序?我也试图排名的行像下面,Sphinxsearch维护sql的订购

source popular 
{ 
    type   = mysql 

    sql_host  = -------- 
    sql_user  = -------- 
    sql_pass  = -------- 
    sql_db   = -------- 
    sql_port  = 3306 # optional, default is 3306 

    sql_query  = \ 
     SET @rank=0; \ 
     SELECT *, @rank := @rank + 1 AS rank \ 
     FROM \ 
     (\ 
      SELECT p.id AS id, p.search AS search, COUNT(CASE WHEN li.date > DATE_SUB(CURDATE(), INTERVAL 1 DAY) THEN li.id END) AS daily_likes, COUNT(CASE WHEN li.date > DATE_SUB(CURDATE(), INTERVAL 7 DAY) THEN li.id END) AS weekly_likes, COUNT(li.id) AS total_likes \ 
      FROM `photo` p \ 
      JOIN `like` li \ 
       ON p.id = li.photo_id \ 
      WHERE \ 
      li.date > DATE_SUB(CURDATE(), INTERVAL 30 DAY) \ 
      GROUP BY \ 
      p.id \ 
     ) AS dt \ 
     ORDER BY \ 
      case when daily_likes > 3 then daily_likes else 0 end desc, \ 
      case when weekly_likes > 5 then weekly_likes else 0 end desc, \ 
      total_likes DESC \ 
     LIMIT 30 

    sql_attr_uint  = daily_likes 
    sql_attr_uint  = weekly_likes 
    sql_attr_uint  = total_likes 
    sql_attr_uint  = rank 

    sql_query_info  = SELECT * FROM photo WHERE id=$id 
} 

我尝试这样做,这样我可以在以后使用类似$s->SetSortMode(SPH_SORT_EXTENDED, '@relevance DESC, rank ASC');。但是,似乎自定义变量在sphinx中不起作用。

所以我的问题是索引一个sql语句,并使用sphinx(php api)精确输出它 - 即使维护sql排序。

+0

你定义“排名”作为'sql_attr_uint'? – barryhunter

+0

@barryhunter是的,我做到了。索引器给我这样一个错误:'错误:索引'流行':sql_query:你的SQL语法有错误;请检查与您的MySQL服务器版本相对应的手册,以在'SELECT *,@rank:= @rank + 1 AS rank'附近使用正确的语法' – pewpewlasers

+0

嗯,您必须在配置文件中出现某种错误。这将有助于包括你的文件。也许使用pastebin.com并记得删除你的db荣誉。 – barryhunter

回答

0

好的,谢谢barryhunter(救主)帮助解决这个问题。正如他在他的评论中提到SET应该在sql_query_pre。所以我conf文件看起来是这样的:

sql_query_pre = SET @rank=0 
sql_query  = \ 
    SELECT *, @rank := @rank + 1 AS rank \ 
    FROM \ 
    (\