Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 连接两个不同表的SQL查询。从用户';最后的互动_Php_Sql_Mariadb - Fatal编程技术网

Php 连接两个不同表的SQL查询。从用户';最后的互动

Php 连接两个不同表的SQL查询。从用户';最后的互动,php,sql,mariadb,Php,Sql,Mariadb,问题描述:根据会话表中的上次交互查找治疗师用户的在线状态。无法在用户表中保留上次交互日期,但应在会话表中将其分开。但是,如何将每个用户的一行与user表信息和session表的会话数据连接起来,以用于每个记录的用户最后一次交互 图1描述:用户表中的治疗师列表,根据他们在会话表中的最后一次交互显示他们的在线状态 图2(用户)说明:用户表是第一个表,电子邮件是其主键。它需要与第二列连接,即会话表的开始日期字段,作为每条记录的一行。(粉色背景的StartDate列不在User表上。User表列加上

问题描述:根据
会话
表中的上次交互查找治疗师用户的在线状态。无法在
用户
表中保留上次交互日期,但应在
会话
表中将其分开。但是,如何将每个用户的一行与
user
表信息和
session
表的会话数据连接起来,以用于每个记录的用户最后一次交互

图1描述:用户表中的治疗师列表,根据他们在会话表中的最后一次交互显示他们的在线状态

图2(用户)说明:用户表是第一个表,电子邮件是其主键。它需要与第二列连接,即会话表的开始日期字段,作为每条记录的一行。(粉色背景的
StartDate
列不在
User
表上。
User
表列加上粉色背景的
StartDate
列是理想的结果)

问题最难的部分是
电子邮件
是连接字段的基础,在
用户
表中只有一个,但在
会话
表中有很多,因为它不是主要字段

图3(会话)的描述:当用户在程序中交互时,电子邮件字段重复。它们是按键更改个人信息的日志,例如

我无法创建一个限定查询来解决我的问题,因此我为table1创建了一个查询,并在循环中创建了第二个查询,这不是正确的工作方式。它导致了性能问题。我需要帮助同时连接两个不同的查询

第一个查询根据主键
电子邮件
用户表筛选结果。第二个查询从循环中的session表中获取最新的会话日期

$marker\u list
是第一个查询,
$sql\u online
用于嵌套的第二个查询

<?php

$latitude = filter_input(INPUT_GET, "latitude", FILTER_SANITIZE_SPECIAL_CHARS);
$longitude = filter_input(INPUT_GET, "longitude", FILTER_SANITIZE_SPECIAL_CHARS);
$start = filter_input(INPUT_GET, "start", FILTER_SANITIZE_SPECIAL_CHARS);
$email = filter_input(INPUT_GET, "email", FILTER_SANITIZE_EMAIL);

include_once "./connect-db.php";

if ($start == 'undefined') {
    $start = 0;
} else {
    $start = $start * 10;
}
$distance = 100;
//First query: lists therapists from User table
$marker_list = "SELECT `User`.`uid`, `User`.`latitude`, `User`.`longitude`, `User`.`name`, `User`.`phone_verified`, `User`.`email`, ( 3959 * acos(cos(radians(" . $latitude . ")) * cos(radians(latitude)) * cos(radians(longitude) - radians(" . $longitude . ")) + sin(radians(" . $latitude . ")) * sin(radians(latitude ))) ) AS `distance` FROM `massage`.`User` WHERE rol= 'terapist' AND list_on_maps= '1' AND email_valid='1' HAVING distance < $distance ORDER BY distance LIMIT $start, 7";

if ($results = mysqli_query($conn, $marker_list)) {
     $sizeofquery = mysqli_num_rows($results);
     $counter = 0; 
     $maps = array();
     while ($row = mysqli_fetch_row($results)) {
         $maps[$counter] = new stdClass();
         $maps[$counter]->index = $row[0];
         $maps[$counter]->latlng = new stdClass();
         $maps[$counter]->latlng->latitude = floatval($row[1]);
         $maps[$counter]->latlng->longitude = floatval($row[2]);
         $maps[$counter]->title = $row[3];
         $maps[$counter]->phone_verified = $row[4];
//Second query gets their user interaction from Session table        
         $sql_online= "SELECT `StartDate` FROM `massage`.`Session` WHERE `email`='$row[5]' ORDER BY `Session`.`StartDate` DESC LIMIT 1";
         $result_nested= mysqli_query($conn, $sql_online);
         $row_online= mysqli_fetch_array($result_nested);
         $delta= (strtotime("now") - strtotime($row_online['StartDate']));
         if ($delta < 300 ) {
             $maps[$counter]->online = "y";
         } else if ( $delta < 600){
             $maps[$counter]->online = "t";
         } else {
             $maps[$counter]->online = "g";
         }
         $counter++;
    }
    $maps->counter = $row['counter'];
    $mapsJSON = json_encode($maps);
}
//Third Query: Inserts last interaction as listing therapists as on many pages. It is not an important part of the question.
$sql_session = "INSERT INTO `massage`.`Session` (`StartDate`, `email`, `Interaction`) VALUES (current_timestamp(), '$email', 'dolistmaps');";
mysqli_query($conn, $sql_session);
header('Content-type:application/json;charset=utf-8');
echo $mapsJSON;
mysqli_free_result($results);
mysqli_close($conn);

连接两个表的
SQL
语法使用
JOIN
关键字。可以使用以下语法连接两个具有公共列的表:

select StartDate
from Masage.Session masag
inner join User user on masag.email = user.email

这是用于
内部联接
。如果您想要
左外连接
右外连接
,或者
完全外连接
或甚至
交叉连接
,则应使用适当的关键字替换连接原因。我希望我回答了你的问题。

连接两个表的
SQL
语法使用
JOIN
关键字。可以使用以下语法连接两个具有公共列的表:

select StartDate
from Masage.Session masag
inner join User user on masag.email = user.email

这是用于
内部联接
。如果您想要
左外连接
右外连接
,或者
完全外连接
或甚至
交叉连接
,则应使用适当的关键字替换连接原因。我希望我回答了您的问题。

您可以使用
MAX
会话
中为派生表中的每封电子邮件查找最新的
开始日期
,并将其加入到用户表中以获得所需的结果:

SELECT `User`.`uid`,
       `User`.`latitude`,
       `User`.`longitude`,
       `User`.`name`,
       `User`.`phone_verified`,
       `User`.`email`,
       ( 3959 * acos(cos(radians(" . $latitude . ")) * cos(radians(latitude)) * cos(radians(longitude) - radians(" . $longitude . ")) + sin(radians(" . $latitude . ")) * sin(radians(latitude ))) ) AS `distance`,
       s.StartDate
FROM `massage`.`User`
JOIN (
    SELECT email, MAX(StartDate) AS StartDate
    FROM `massage.Session`
    GROUP BY email
) s ON s.email = `User`.email
WHERE rol= 'terapist' AND list_on_maps= '1' AND email_valid='1'
HAVING distance < $distance 
ORDER BY distance 
LIMIT $start, 7
选择'User`.'uid`,
`用户`.`latitude`,
`用户`.`经度`,
`用户`.`name`,
`用户`.`phone_verified`,
`用户`.`email`,
(3959*acos(弧度(“.$纬度”)*cos(弧度(纬度))*cos(弧度(经度)-弧度(“.$经度”)+sin(弧度(“.$纬度”)*sin(弧度(纬度)))作为“距离”,
s、 起始日期
来自“按摩”。“用户”`
加入(
选择电子邮件,最大(起始日期)作为起始日期
来自“按摩”会话`
通过电子邮件分组
)s ON s.email=`User`.email
其中rol='terapist'和地图上的列表\'1'和电子邮件\'U valid='1'
距离小于或等于距离
按距离排序
限制$start,7

您可以使用
MAX
会话
中为派生表中的每封电子邮件查找最新的
起始日期
,并将其加入到用户表中以获得所需的结果:

SELECT `User`.`uid`,
       `User`.`latitude`,
       `User`.`longitude`,
       `User`.`name`,
       `User`.`phone_verified`,
       `User`.`email`,
       ( 3959 * acos(cos(radians(" . $latitude . ")) * cos(radians(latitude)) * cos(radians(longitude) - radians(" . $longitude . ")) + sin(radians(" . $latitude . ")) * sin(radians(latitude ))) ) AS `distance`,
       s.StartDate
FROM `massage`.`User`
JOIN (
    SELECT email, MAX(StartDate) AS StartDate
    FROM `massage.Session`
    GROUP BY email
) s ON s.email = `User`.email
WHERE rol= 'terapist' AND list_on_maps= '1' AND email_valid='1'
HAVING distance < $distance 
ORDER BY distance 
LIMIT $start, 7
选择'User`.'uid`,
`用户`.`latitude`,
`用户`.`经度`,
`用户`.`name`,
`用户`.`phone_verified`,
`用户`.`email`,
(3959*acos(弧度(“.$纬度”)*cos(弧度(纬度))*cos(弧度(经度)-弧度(“.$经度”)+sin(弧度(“.$纬度”)*sin(弧度(纬度)))作为“距离”,
s、 起始日期
来自“按摩”。“用户”`
加入(
选择电子邮件,最大(起始日期)作为起始日期
来自“按摩”会话`
通过电子邮件分组
)s ON s.email=`User`.email
其中rol='terapist'和地图上的列表\'1'和电子邮件\'U valid='1'
距离小于或等于距离
按距离排序
限制$start,7

您的代码易受SQL注入攻击。您应该使用准备好的声明。您想基于
用户
电子邮件
会话
电子邮件
?@RonakDhoot是的,我想基于User.email和会话加入。email@Dharman非常感谢。我现在正在学习准备好的语句,学习后将更新项目中的所有代码。您的代码易受SQL注入攻击。您应该使用准备好的声明。您想基于
用户
电子邮件
会话
电子邮件
?@RonakDhoot是的,我想基于User.email和会话加入。email@Dharman非常感谢。我现在正在学习准备好的语句,学习后会更新项目中的所有代码。非常感谢,但是你的回答对我来说太笼统了。我试过了,但不知道如何创建查询。这是我的错,但无论如何还是要谢谢您。@EnginYilmaz您可能应该阅读
dba.stackexchange
上的
如何提问
一节。这里是链接。其他人可能会有空余时间,在没有样本数据和预期输出的情况下,按原样抽取代码。但是我现在太忙了。对不起。@EnginYilmaz谢谢你,Engin。请注意