Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.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/8/mysql/57.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 mysql上连接和过滤多个表中数据的快速方法_Php_Mysql - Fatal编程技术网

Php mysql上连接和过滤多个表中数据的快速方法

Php mysql上连接和过滤多个表中数据的快速方法,php,mysql,Php,Mysql,首先,我很抱歉我的英语不好…我开发了一个php应用程序来输入我办公室的商户访问结果 下面是我的mysql数据库的结构: 表商户: 表设备: 表访问: 这3个表的关系如下所示: device.merchid -> merchant.id visit.merchid -> merchant.id visit.deviceid -> device.id 我想要的是将3个表连接为包含以下字段的视图: 查看连接设备: 其中,lastact、lastresult和lastvisit使用每

首先,我很抱歉我的英语不好…我开发了一个php应用程序来输入我办公室的商户访问结果

下面是我的mysql数据库的结构:

商户
:
表
设备
:
表
访问
:
这3个表的关系如下所示:

device.merchid -> merchant.id
visit.merchid -> merchant.id
visit.deviceid -> device.id
我想要的是将3个表连接为包含以下字段的视图:

查看连接设备
: 其中,lastact、lastresult和lastvisit使用每个设备的“访问”表中的数据。 我现在所做的是使用下面的查询创建mysql视图:

select
device.id AS devid,
device.merchid AS merchid,
merchant.name AS merchname,
merchant.address AS merchaddr,
merchant.phone AS merchph,
merchant.area AS mercharea,
device.tid AS devtid,
device.sn AS devsn,
device.status AS devstat,
ifnull(
(
select visit.act from visit
where visit.devid = device.id
order by visit.date desc limit 1
),''
)AS lastact,
ifnull(
(
select visit.date from visit
where (visit.devid=device.id)
order by visit.date desc limit 1
),''
)AS lastvisit,
ifnull(
(
select visit.result from visit
where (visit.devid=device.id)
order by visit.date desc limit1
),''
)AS lastresult
from (device join merchant) where (merchant.id=device.merchid)
下面是调用JoinDevice视图的php脚本:

<?php
$sql = "SELECT * FROM joindevice order by merchname asc";
$qry=mysql_query($sql);
$check=mysql_num_rows($qry);
if($check>0){
?>
<table>
<thead>
<tr>
<th>No.</th>
<th>TID</th>
<th>SN</th>
<th>Phone</th>
<th>Merchant Name</th>
<th>Merchant Address</th>
<th>Merchant Area</th>
<th>Device Status</th>
<th>Last Visit</th>
<th>Last Act</th>
<th>Last Result</th>
</tr>
</thead>
<tbody>
<?php
$no=1;
while($dt=mysql_fetch_assoc($qry)){
?>
<tr>
<td><?php echo $no; ?></td>
<td><?php echo empty($dt['tid'])?'-':$dt['tid']; ?></td>
<td><?php echo empty($dt['sn'])?'-':$dt['sn']; ?></td>
<td><?php echo empty($dt['merchph'])?'-':$dt['merchph']; ?></td>
<td><?php echo empty($dt['merchname'])?'-':$dt['merchname']; ?></td>
<td><?php echo empty($dt['merchaddr'])?'-':$dt['merchaddr']; ?></td>
<td><?php echo empty($dt['mercharea'])?'-':$dt['mercharea']; ?></td>
<td><?php echo empty($dt['devstat'])?'-':$dt['devstat']; ?></td>
<td><?php echo empty($dt['lastvisit'])?'-':$dt['lastvisit']; ?></td>
<td><?php echo empty($dt['lastact'])?'-':$dt['lastact']; ?></td>
<td><?php echo empty($dt['lastresult'])?'-':$dt['lastresult']; ?></td>
</tr>
<?php
$no++;
}
?>
</tbody>
</table>
<?php
}
?>

不
工业贸易署
锡
电话
商户名称
商户地址
商圈
设备状态
最后一次访问
最后一幕
最后结果

当'device'表中的数据很小时,一切正常,但现在数据约为1700项,因此执行该php脚本的时间太长,有时当我执行该php脚本时,结果是网关超时,但当我执行只从一个表中获取数据的php脚本时,它会快速打开……有人能帮我减少执行时间吗?我该怎么办?

您可以尝试删除那些相关的子查询,并用正式联接替换它们:

SELECT
    t1.id AS devid,
    t1.merchid AS merchid,
    t1.tid AS devtid,
    t1.sn AS devsn,
    t1.status AS devstat,
    t2.act AS lastact,
    t2.date AS lastvisit,
    t2.result AS lastresult,
    t3.name AS merchname,
    t3.address AS merchaddr,
    t3.phone AS merchph,
    t3.area AS mercharea,
FROM device t1
INNER JOIN
(
    SELECT t1.*
    FROM visit t1
    INNER JOIN
    (
        SELECT devid, MAX(date) AS date
        FROM visit
        GROUP BY devid
    ) t2
        ON t1.devid = t2.devid AND
           t1.date  = t2.date
) t2
    ON t1.id = t2.devid
INNER JOIN merchant t3
    t1.merchid = t3.id

索引是否有利于上述内容取决于许多因素,但无论如何,我希望比原始查询有所改进。

您可以尝试删除那些相关的子查询,并用正式联接替换它们:

SELECT
    t1.id AS devid,
    t1.merchid AS merchid,
    t1.tid AS devtid,
    t1.sn AS devsn,
    t1.status AS devstat,
    t2.act AS lastact,
    t2.date AS lastvisit,
    t2.result AS lastresult,
    t3.name AS merchname,
    t3.address AS merchaddr,
    t3.phone AS merchph,
    t3.area AS mercharea,
FROM device t1
INNER JOIN
(
    SELECT t1.*
    FROM visit t1
    INNER JOIN
    (
        SELECT devid, MAX(date) AS date
        FROM visit
        GROUP BY devid
    ) t2
        ON t1.devid = t2.devid AND
           t1.date  = t2.date
) t2
    ON t1.id = t2.devid
INNER JOIN merchant t3
    t1.merchid = t3.id

索引是否有利于上述内容取决于许多因素,但无论如何,我希望比原始查询有所改进。

是否强制要求每一行同时返回@anggazanIs您是否强制要求每一行同时返回@安哥拉
select
device.id AS devid,
device.merchid AS merchid,
merchant.name AS merchname,
merchant.address AS merchaddr,
merchant.phone AS merchph,
merchant.area AS mercharea,
device.tid AS devtid,
device.sn AS devsn,
device.status AS devstat,
ifnull(
(
select visit.act from visit
where visit.devid = device.id
order by visit.date desc limit 1
),''
)AS lastact,
ifnull(
(
select visit.date from visit
where (visit.devid=device.id)
order by visit.date desc limit 1
),''
)AS lastvisit,
ifnull(
(
select visit.result from visit
where (visit.devid=device.id)
order by visit.date desc limit1
),''
)AS lastresult
from (device join merchant) where (merchant.id=device.merchid)
<?php
$sql = "SELECT * FROM joindevice order by merchname asc";
$qry=mysql_query($sql);
$check=mysql_num_rows($qry);
if($check>0){
?>
<table>
<thead>
<tr>
<th>No.</th>
<th>TID</th>
<th>SN</th>
<th>Phone</th>
<th>Merchant Name</th>
<th>Merchant Address</th>
<th>Merchant Area</th>
<th>Device Status</th>
<th>Last Visit</th>
<th>Last Act</th>
<th>Last Result</th>
</tr>
</thead>
<tbody>
<?php
$no=1;
while($dt=mysql_fetch_assoc($qry)){
?>
<tr>
<td><?php echo $no; ?></td>
<td><?php echo empty($dt['tid'])?'-':$dt['tid']; ?></td>
<td><?php echo empty($dt['sn'])?'-':$dt['sn']; ?></td>
<td><?php echo empty($dt['merchph'])?'-':$dt['merchph']; ?></td>
<td><?php echo empty($dt['merchname'])?'-':$dt['merchname']; ?></td>
<td><?php echo empty($dt['merchaddr'])?'-':$dt['merchaddr']; ?></td>
<td><?php echo empty($dt['mercharea'])?'-':$dt['mercharea']; ?></td>
<td><?php echo empty($dt['devstat'])?'-':$dt['devstat']; ?></td>
<td><?php echo empty($dt['lastvisit'])?'-':$dt['lastvisit']; ?></td>
<td><?php echo empty($dt['lastact'])?'-':$dt['lastact']; ?></td>
<td><?php echo empty($dt['lastresult'])?'-':$dt['lastresult']; ?></td>
</tr>
<?php
$no++;
}
?>
</tbody>
</table>
<?php
}
?>
SELECT
    t1.id AS devid,
    t1.merchid AS merchid,
    t1.tid AS devtid,
    t1.sn AS devsn,
    t1.status AS devstat,
    t2.act AS lastact,
    t2.date AS lastvisit,
    t2.result AS lastresult,
    t3.name AS merchname,
    t3.address AS merchaddr,
    t3.phone AS merchph,
    t3.area AS mercharea,
FROM device t1
INNER JOIN
(
    SELECT t1.*
    FROM visit t1
    INNER JOIN
    (
        SELECT devid, MAX(date) AS date
        FROM visit
        GROUP BY devid
    ) t2
        ON t1.devid = t2.devid AND
           t1.date  = t2.date
) t2
    ON t1.id = t2.devid
INNER JOIN merchant t3
    t1.merchid = t3.id