单个mysql查询以获取具有ID的数据并获取相关数据

时间:2014-11-27 16:13:28

标签: mysql json

我需要形成一个单独的mysql查询,以从具有ID的表中获取*数据,以及与第一个查询的“标题”匹配的4个相关数据。

表名: Feeditems

行: item_iditem_titleitem_description

获取我正在使用的数据

$related_sql = "SELECT * FROM feeditems
                WHERE feeditems.item_id='$id' LIMIT 1";

获取我正在使用的相关数据

$related_sql = "SELECT * FROM feeditems
                WHERE feeditems.item_id != '$item_row[item_id]'
                AND MATCH (feeditems.item_title)
                AGAINST ('$item_row[item_title]' IN BOOLEAN MODE)
                ORDER BY feeditems.item_id DESC LIMIT 4";

我需要将这两个查询组合成一个查询,因为我使用以下代码给出了查询的json数据

$set = array();    
$total_records = mysql_num_rows($resouter);
if($total_records >= 1){
    while ($link = mysql_fetch_array($resouter, MYSQL_ASSOC)){
        $set['NewsApp'][] = $link;
    }
}
echo $val= str_replace('\\/', '/', json_encode($set,JSON_UNESCAPED_UNICODE));

否则有任何方法可以使用json_encode将上述2个查询的结果合并到一个json outout中。

2 个答案:

答案 0 :(得分:1)

您可以使用INNER JOIN链接回同一个表:

$related_sql = "SELECT f2.item_id, f2.item_title, f2.item_description 
FROM feeditems f1
INNER JOIN feeditems f2 ON 
             f1.item_id != f2.item_id AND 
             MATCH (f2.item_title) AGAINST (f1.item_title IN BOOLEAN MODE)
WHERE f1.item_id='$id'
ORDER BY f2.item_id DESC LIMIT 4";

更新:我发现由于您使用的是MATCH ... AGAINST,因此无效。

"表达式不必是文字字符串,但它必须是在查询评估期间具有常量值的表达式。例如,这允许变量,但排除列名。"

查看http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html#function_matchhttp://bugs.mysql.com/bug.php?id=66573MySQL Fulltext search against column value?

就像lolka_polka所说的那样,使用子查询它会起作用:

$related_sql = "SELECT item_id, item_title, item_description 
FROM feeditems
WHERE item_id != '$id' AND 
             MATCH (item_title) AGAINST ((SELECT item_title FROM feeditems
                WHERE item_id='$id' LIMIT 1) IN BOOLEAN MODE)
ORDER BY item_id DESC LIMIT 4";

请参阅SQLFIDDLE

UPDATE2 :使用UNION

$related_sql = "(SELECT item_id, item_title, item_description 
FROM feeditems
WHERE item_id = '$id' LIMIT 1)
UNION 
(SELECT item_id, item_title, item_description 
FROM feeditems
WHERE item_id != '$id' AND 
             MATCH (item_title) AGAINST ((SELECT item_title FROM feeditems
                WHERE item_id='$id' LIMIT 1) IN BOOLEAN MODE)
ORDER BY item_id DESC LIMIT 4)
ORDER BY item_id;";

请参阅SQLFIDDLE

答案 1 :(得分:0)

您可以在查询中使用子查询。试试这个:

$related_sql = "
SELECT * 
  FROM feeditems
 WHERE feeditems.item_id != $id 
   AND MATCH (feeditems.item_title) AGAINST ((SELECT item_title WHERE feeditems.item_id=$id) LIMIT 1 IN BOOLEAN MODE)
 ORDER 
    BY feeditems.item_id DESC
 LIMIT 4
";

注意

  • 不要使用mysql函数,不推荐使用它们。请改用mysqliPDO

  • 您很容易受到sql注入攻击。始终在查询中使用变量,或使用预准备语句。