0

我有以下 sql 语句,它运行良好,因为我将所有内容都转移到 PDO,所以我在尝试转换这个复杂的语句时遇到了最糟糕的时间。它在下面工作:

$sql_res=mysql_query("SELECT a.first_name, a.last_name, a.uid, a.hometown, 
IF(b.friend_two IS NULL, 0, 1) AS isFriend FROM users a LEFT JOIN friends 
b ON a.uid = b.friend_two AND b.friend_one = $uid WHERE  
CONCAT(a.first_name, ' ', a.last_name) LIKE '%$q%' AND a.uid <> $uid 
ORDER BY isFriend DESC");

我已经尝试了几个小时来转换,这就是我可以从另一个 SO 示例中得到的全部内容(它甚至还没有接近工作)

非常感谢任何帮助。哦,还有 $q 是来自用户的 POST 变量,所以在我的情况下,PDO 是必须的。

更新代码(第二次):

$sql = "select a.first_name, a.last_name, a.uid, a.hometown, 
IF(b.friend_two IS NULL, 0, 1) AS isFriend FROM users a LEFT JOIN 
friends b ON a.uid = b.friend_two AND b.friend_one = :friend_one 
where ( first_name like concat('%', :fname, '%') or last_name like 
concat('%', :lname, '%') ) and a.uid <> :uid ORDER BY isFriend DESC"; 
$stmt= $db->prepare($sql); $stmt->bindValue(':fname', "%$q%", PDO::PARAM_STR); 
$stmt->bindValue(':lname', "%$q%", PDO::PARAM_STR); 
$stmt->execute(array(':friend_one' => $uid,':uid' => $uid));

这可以正常工作,但无法产生与原始 sql 语句相同的结果。

4

1 回答 1

0

删除了额外的from并放在()你的名字过滤器周围,如
A OR B AND C= A OR (B AND C),我猜你想要(A OR) B AND C

select
  a.first_name,
  a.last_name,
  a.uid,
  a.hometown,
  IF(b.friend_two IS NULL, 0, 1) AS isFriend 
FROM users a 
LEFT JOIN friends b
  ON a.uid = b.friend_two AND b.friend_one = :uid
where 
  (
    first_name like concat('%', :fname, '%') or 
    last_name  like concat('%', :lname, '%') 
  ) and
  a.uid <> :uid 
ORDER BY
  isFriend DESC
于 2012-07-19T22:40:01.483 回答