Php 如何显示基于好友的好友的推荐列表

Php 如何显示基于好友的好友的推荐列表,php,mysql,Php,Mysql,我正在尝试执行一个mysql查询以显示推荐列表。按朋友接近程度排序的推荐列表。我能够根据朋友的推荐对列表进行排序,但是我在根据朋友的朋友对推荐列表进行排序时遇到了问题 以下是表格的设计: /*Table structure for table `recommendation` */ CREATE TABLE `recommendation` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `kategori` varchar(255) NOT

我正在尝试执行一个mysql查询以显示推荐列表。按朋友接近程度排序的推荐列表。我能够根据朋友的推荐对列表进行排序,但是我在根据朋友的朋友对推荐列表进行排序时遇到了问题

以下是表格的设计:

/*Table structure for table `recommendation` */

CREATE TABLE `recommendation` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,  
  `kategori` varchar(255) NOT NULL,  
  `nama` varchar(255) NOT NULL,  
  `rating` set('1','2','3','4','5') NOT NULL,  
  `writer_id` varchar(255) NOT NULL,  
  `search_here` longtext NOT NULL,  
  `user_type` set('0','1') NOT NULL DEFAULT '0',

  PRIMARY KEY (`id`),  
  KEY `kategori` (`kategori`),
  KEY `nama` (`nama`),

  FULLTEXT KEY `search_here` (`search_here`)
)
ENGINE=MyISAM AUTO_INCREMENT=100174
DEFAULT CHARSET=latin1 COMMENT='recommendation table';


/*Table structure for table `user_relationship` */

DROP TABLE IF EXISTS `user_relationship`;
CREATE TABLE `user_relationship` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `me` varchar(255) NOT NULL,
  `friend` varchar(255) NOT NULL,

  PRIMARY KEY (`id`),
  KEY `me` (`me`)
)
ENGINE=MyISAM AUTO_INCREMENT=100982
DEFAULT CHARSET=latin1 COMMENT='user relationship table';
我应用以下查询:

SELECT
  a.id AS ids,
  a.writer_id,
  a.kategori,
  a.rating,
  b.me,
  a.user_type
FROM
  recommendation a
LEFT OUTER JOIN
  user_relationship b
    ON
      a.writer_id = b.friend
    AND
      b.me='$USER_ID'
WHERE
  MATCH(search_here) AGAINST('$SEARCH' IN BOOLEAN MODE)
ORDER BY
  b.me DESC,
  a.writer_id
SELECT 
a.id AS ids,
a.writer_id,
a.kategori,
a.nama,
a.rating,
b.me, b.friend,
c.friend2 AS ff, a.user_type 
FROM recommendation a
LEFT OUTER JOIN webref.user_relationship b 
ON a.oleh = b.friend AND b.me='1010147270'
LEFT OUTER JOIN webref.user_friend_friend c 
ON a.oleh = c.friend AND b.friend IS NULL

WHERE MATCH(search_here) AGAINST('$SEARCH' IN BOOLEAN MODE)
GROUP BY a.id
ORDER BY 
    b.me DESC,
    user_type DESC, 
    rating DESC,
    c.friend DESC,
    a.writer_id
推荐列表应按以下顺序显示:朋友推荐、朋友之友推荐和公众推荐

有人能帮我吗?
谢谢


编辑:

我已尝试创建名为“user\u friend\u friend”的user\u关系表的克隆。 “user\u friend\u friend”表的设计如下:

CREATE TABLE `user_friend_friend` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `friend` varchar(255) NOT NULL,
  `friend2` varchar(255) NOT NULL,

  PRIMARY KEY (`id`),
  KEY `friend` (`friend`)
)
ENGINE=MyISAM AUTO_INCREMENT=100982
DEFAULT CHARSET=latin1 COMMENT='user friend friend table';
我有以下疑问:

SELECT
  a.id AS ids,
  a.writer_id,
  a.kategori,
  a.rating,
  b.me,
  a.user_type
FROM
  recommendation a
LEFT OUTER JOIN
  user_relationship b
    ON
      a.writer_id = b.friend
    AND
      b.me='$USER_ID'
WHERE
  MATCH(search_here) AGAINST('$SEARCH' IN BOOLEAN MODE)
ORDER BY
  b.me DESC,
  a.writer_id
SELECT 
a.id AS ids,
a.writer_id,
a.kategori,
a.nama,
a.rating,
b.me, b.friend,
c.friend2 AS ff, a.user_type 
FROM recommendation a
LEFT OUTER JOIN webref.user_relationship b 
ON a.oleh = b.friend AND b.me='1010147270'
LEFT OUTER JOIN webref.user_friend_friend c 
ON a.oleh = c.friend AND b.friend IS NULL

WHERE MATCH(search_here) AGAINST('$SEARCH' IN BOOLEAN MODE)
GROUP BY a.id
ORDER BY 
    b.me DESC,
    user_type DESC, 
    rating DESC,
    c.friend DESC,
    a.writer_id
有没有更有效的解决方案?

一些性能提示: -对于要加入的列,应该有一个索引。例如,writer_id似乎没有索引。 -即使使用索引,使用VARCHAR(256)作为要加入的列的类型也是很慢的。最好将ID存储为整数。您可以有一个单独的表来存储稍后查询的int->varchar映射

但是,要执行“朋友中的朋友”查询,类似这样的操作应该可以:

SELECT
  a.id AS ids,
  a.writer_id,
  a.kategori,
  a.rating,
  b.me,
  a.user_type
FROM
  recommendation a
LEFT OUTER JOIN
  user_relationship b
    ON
      a.writer_id = b.friend
    AND
      b.me='$USER_ID'
LEFT OUTER JOIN
  user_relationship c
    ON
      a.writer_id = c.friend
    AND
      c.me = b.friend

如果你想在问题中添加更多内容,只需编辑你的问题,而不是添加额外的部分作为答案。hai andrey,谢谢你的回答。我试过这样的疑问。我可以通过检查“我”列的值来找到我朋友的推荐。但是,我怎样才能从朋友的朋友那里找到推荐信呢?谢谢。您希望将其更改为选择c.me而不是b.me