2014-02-19 21 views
0

我正在使用下面的基本选择查询来显示我的表中最新的20行。MySQL:获取每个选定行的相关结果

SELECT * FROM my_table ORDER BY id DESC limit 0,20 

那么我想相关的结果上述每个选定的行...什么我目前做的是运行在之后在一个循环的每一行“PHP”查询..

SELECT * MATCH (title) 
AGAINST('$main_title'IN NATURAL LANGUAGE MODE)AS 
score FROM my_table MATCH(title) AGAINST('$main_title'IN NATURAL LANGUAGE MODE) 
HAVING score > 10 ORDER BY score DESC 

所以完整的“PHP”的代码如下所示:

<?php 
// First Query 
$query= mysql_query("SELECT * FROM my_table ORDER BY id DESC limit 0,20"); 
$result = mysql_query($query) 

while($row = mysql_fetch_array($result)){ 
echo "Main Topic: ".$row['title']; 
$main_title = $row['title']; 
    echo "Related to this Topic:"; 

    // Second Query 
    $related_query= mysql_query(" 
    SELECT * MATCH (title) 
    AGAINST('$main_title'IN NATURAL LANGUAGE MODE)AS 
    score FROM my_table MATCH(title) AGAINST('$main_title'IN NATURAL LANGUAGE MODE) 
    HAVING score > 10 ORDER BY score DESC 
    "); 
    $related_result = mysql_query($related_query) 

      while($related_row = mysql_fetch_array($related_result)){ 
      echo "<br>". $related_row['title']; 
    } 


} 
?> 

,但我知道,在非常低效运行的一个循环内的第二次查询,所以我想这些“相关的结果”也在主q uery(或在单独的单个查询,而无需在循环中运行)

基本上我正在寻找一种方法做同样的,更有效地..

是有办法我可以做这个?

谢谢

+0

定义“相关结果”,以便我们不必猜测:) – Ashalynd

+0

相关结果是在每个选定行中针对“标题”列的全文搜索... – nidahasa

回答

1

假设你只想拥有标题和分数,这个工作吗?

SELECT MATCH(title) AGAINST('$main_title' IN NATURAL LANGUAGE MODE) as SCORE, 
title FROM my_table WHERE 
MATCH(title) AGAINST('$main_title' IN NATURAL LANGUAGE MODE) 
AND score > 10 AND id<=20 ORDER BY score DESC; 
+0

我知道如何搜索相关结果。他的问题是我必须运行第一个查询中的每一行的第二个查询(在PHP中的循环内)。我只是想避免再次运行第二个查询循环..我希望我足够清楚 – nidahasa

+0

此查询对整个表运行。我已经添加了行子句来像你一样对行进行限制。 – Ashalynd

+0

但我想为每行分别得到这些“相关的结果”..我的意思是对于row1一组单独的“相关行”,对于第2行另一组“相关行”..就像... – nidahasa

1

首先,我认为第二个查询更像是这样的:

SELECT mt.*, 
     MATCH (title) AGAINST('$main_title'IN NATURAL LANGUAGE MODE) AS score 
FROM my_table mt 
WHERE MATCH(title) AGAINST('$main_title' IN NATURAL LANGUAGE MODE) > 10 
ORDER BY score DESC; 

如果你想只为my_table 20个IDS做到这一点,那么使用子查询:

SELECT mt.*, 
     MATCH (title) AGAINST('$main_title'IN NATURAL LANGUAGE MODE) AS score 
FROM (select mt.* 
     from my_table mt 
     order by id desc 
     limit 0, 20 
    ) mt 
WHERE MATCH(title) AGAINST('$main_title' IN NATURAL LANGUAGE MODE) > 10 
ORDER BY score DESC; 
+0

Gordon Linoffthanks。但我无法理解我如何回应20个主要标题。对不起,我有点新到这.. – nidahasa

+0

@ user3327581。 。 。第二个查询应该在单个查询中执行查询在循环中执行的操作。它应该返回相同的结果。 –

+0

但是如何获得这个查询的主要主题列表?对不起,如果我不够清楚..我已经编辑了这个问题,所以现在应该更清楚了...... – nidahasa