[英]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: 以下是存储的表和数据:
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.