简体   繁体   English

修复SQL语句中的错误

[英]Fixing errors in sql statement

I have 3 tables of which i queried the first table (users) to get this result: 我有3个表,我查询了第一个表(用户)以得到此结果:

$String_users='19,20,21,22,25,26,27,28,29,30,31,32,33,34';

and I want to filter through two other tables friends and freinds_request and remove ids in the numbers so that I cud do something with later but to my poor understanding it returns this error: 我想通过其他两个表friend和freinds_request进行过滤,并删除数字中的id,以便稍后对某些内容进行处理,但是由于我的理解较差,它返回了此错误:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\cebs\include\functions.php on line 825

I then tried to run query from sql command - phpmyadmin to see what was wrong: 然后,我尝试从sql命令-phpmyadmin运行查询,以了解出了什么问题:

 SELECT id FROM users WHERE id NOT IN
(SELECT user_one,user_two FROM friends WHERE (user_one='18' AND user_two IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34')) 
     OR (user_one IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34') AND user_two='18')) 
     AND id NOT IN( SELECT to_user,from_user FROM friend_reqest WHERE (to_user='18' AND from_user IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34') OR (to_user IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34') AND from_user='18'))
                                           )
                                           )

but MYSQL Said: 但是MYSQL说:

#1241 - Operand should contain 1 column(s) 

below is my php code also: 下面也是我的php代码:

function somepeopleyoumayknow(){


global $dbc_conn, $IsLoggIn,$table_name,$friend_request_table,$friends_table ; 
$cu_school = getuser($IsLoggIn,'cell_group');

//assuming $IsLoggIn is equal  to 18...

$peopleids= mysqli_query($dbc_conn,"SELECT id FROM $table_name WHERE id !='$IsLoggIn'");
$sql_num_rows = mysqli_num_rows($peopleids);
if($sql_num_rows > 0){
while($run_peopleids= mysqli_fetch_array($peopleids)){

    $users_ids[] = $run_peopleids['id'];

}   
$string_users = implode(',',$users_ids);

 $sql = "SELECT id FROM $table_name WHERE id NOT IN
 (SELECT user_one,user_two FROM $friends_table WHERE (user_one='$IsLoggIn' AND user_two IN($string_users)) 
 OR (user_one IN($string_users) AND user_two='$IsLoggIn')) 
 AND id NOT IN( SELECT to_user,from_user FROM $friend_request_table WHERE (to_user='$IsLoggIn' AND from_user IN($string_users) OR (to_user IN($string_users) AND from_user='$IsLoggIn'))
                                       )";
   $filter_id_query = mysqli_query($dbc_conn,$sql);
   $fnrows = mysqli_num_rows($filter_id_query);

   if($fnrows > 0){
       while($run_fiq=mysqli_fetch_array($filter_id_query)){
           $uid[] = $run_fiq['id'];
       }

      echo $filtered_id_users = implode(',',$uid);

   }



}



}

below are the tables and data stored: 以下是存储的表和数据:

users 使用者 usersTable

friends 朋友们 稳定的

friend_request 好友请求 firendRequesttable

How can I fix this problem? 我该如何解决这个问题? Thank you. 谢谢。

UPDATED : OK, then your sql-statement should look like this: UPDATED :确定,然后您的sql语句应如下所示:

SELECT * FROM (
    SELECT user_one as id
    FROM friends 
    WHERE user_one != :loggedInId
    UNION 
    SELECT user_two as id
    FROM friends
    WHERE user_two != :loggedInId
)
WHERE id NOT IN (
    SELECT from_user as id
    FROM friend_request 
    WHERE to_user = :loggedInId
    UNION
    SELECT to_user as id
    FROM friend_request
    WHERE from_user = :loggedInId
)

PS And, of course, use prepared statements instead. PS并且,当然,请使用准备好的语句。 I suggest using PDO . 我建议使用PDO If you don't have a possibility, use mysqli::prepare method. 如果没有可能,请使用mysqli :: prepare方法。 It will make you code look like this (just change :loggedInId to ? ): 它将使您的代码看起来像这样(只需将:loggedInId更改为? ):

if ($stmt = $mysqli->prepare($sql)) {
    $stmt->bind_param('i', $loggedInId);
    $stmt->execute();
    $stmt->fetch();
    $stmt->close();
}

There is a issue like remove single quote inside in() otherwise it will consider a single string: 有一个问题,例如在in()中删除single quote ,否则它将考虑单个字符串:

(SELECT user_one,user_two FROM friends WHERE (user_one='18' AND user_two IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34')) OR (user_one IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34') AND user_two='18')) AND id NOT IN( SELECT to_user,from_user FROM friend_reqest WHERE (to_user='18' AND from_user IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34') OR (to_user IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34') AND from_user='18')) ) )

Please update as below: 请更新如下:

(SELECT user_one,user_two FROM friends WHERE (user_one='18' AND user_two IN(19,20,21,22,25,26,27,28,29,30,31,32,33,34)) OR (user_one IN(19,20,21,22,25,26,27,28,29,30,31,32,33,34) AND user_two='18')) AND id NOT IN( SELECT to_user,from_user FROM friend_reqest WHERE (to_user='18' AND from_user IN(19,20,21,22,25,26,27,28,29,30,31,32,33,34) OR (to_user IN(19,20,21,22,25,26,27,28,29,30,31,32,33,34) AND from_user='18')) ) )

Your query is not logically correct, when you do where clause + sub select like: 当执行where子句和sub选择时,查询在逻辑上是不正确的:

WHERE <columnX> NOT IN (SELECT <columnX from table x)

You should select only 1 operand/column ie columnX in the sub query. 您只能在子查询中选择1个操作数/列,即columnX。 See below the boldded : 参见下面的粗体:

$sql = "SELECT id FROM $table_name WHERE **id** NOT IN
 (SELECT **id** FROM $friends_table WHERE (user_one='$IsLoggIn' AND user_two IN($string_users)) 
 OR (user_one IN($string_users) AND user_two='$IsLoggIn')) 
AND id NOT IN( SELECT **id** FROM $friend_request_table WHERE   (to_user='$IsLoggIn' AND from_user IN($string_users) OR (to_user  IN($string_users) AND from_user='$IsLoggIn'))

Upon scratching my head reading what Dimitiri posted I re-think and re-write the SQL Statement below is my answer: 读了Dimitiri发表的内容后,我重新思考并重新编写下面的SQL语句是我的答案:

$sql = "SELECT id FROM $table_name WHERE id NOT IN

( SELECT user_one FROM $friends_table WHERE (user_one='$IsLoggIn' AND user_two IN($string_users)) OR (user_one IN($string_users) AND user_two='$IsLoggIn')) AND id NOT IN(SELECT user_two FROM $friends_table WHERE (user_one='$IsLoggIn' AND user_two IN($string_users)) OR ( user_one IN($string_users) AND user_two='$IsLoggIn')) (在$ friends_table中选择user_one(user_one ='$ IsLoggIn'AND user_two IN($ string_users))或(user_one IN($ string_users)AND user_two ='$ IsLoggIn'))AND ID NOT IN(在$ friends_table中选择user_two (user_one ='$ IsLoggIn'AND user_two IN($ string_users))或(user_one IN($ string_users)AND user_two ='$ IsLoggIn'))

AND id NOT IN (SELECT from_user FROM $friend_request_table WHERE(from_user='$IsLoggIn' AND to_user IN($string_users)) OR (from_user IN($string_users) AND to_user='$IsLoggIn')) AND ID NOT IN(从$ friend_request_table WHERE(from_user ='$ IsLoggIn'AND to_user IN($ string_users))中选择from_user或(from_user IN($ string_users)AND to_user ='$ IsLoggIn')

AND id NOT IN (SELECT to_user FROM $friend_request_table WHERE(from_user='$IsLoggIn' AND to_user IN($string_users)) OR (from_user IN($string_users) AND to_user='$IsLoggIn'))"; AND ID NOT IN(从$ friend_request_table WHERE(from_user ='$ IsLoggIn'AND to_user IN($ string_users))中选择to_user,或(from_user IN($ string_users)AND to_user ='$ IsLoggIn'))“;

This filters and remove all the ids in both tables. 这将过滤并删除两个表中的所有ID。 Previously in my friends table i had 5 ids representing friends upon running this query above these ids are removed: 以前在我的好友表中,我在运行此查询上方的5个代表朋友的ID时,删除了这些ID:

below is a photo to prove it: 以下是证明这一点的照片:

$String_users='19,20,21,22,25,26,27,28,29,30,31,32,33,34'; $ String_users = '19,20,21,22,25,26,27,28,29,30,31,32,33,34';

$filtered_id_users= 19,25,27,28,29,31,32,34 $ filtered_id_users = 19,25,27,28,29,31,32,34

EXPLAINING: 说明:

This means i was already friends with ids: 21,22,26,30 (Friends table) 这意味着我已经是ID为:21、22、26、30的朋友(“朋友”表)

and

I had 1 friend request which connotes to id 33 (friend_requst_table) 我有1个朋友请求,代表ID 33(friend_requst_table)

专业

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM