Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.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_Sqlite_Join - Fatal编程技术网

Php SQL有条件地与多行连接

Php SQL有条件地与多行连接,php,sqlite,join,Php,Sqlite,Join,我在一个SQLite数据库中有两个表,我正在通过PHP访问它 这是示例数据,足以描述我想做什么,但不能说明原因。 让我们调用这些表:TableA、TableB和TableC ------------------------ | Unique_ID | Name | ------------------------ | 1 | Sam | ------------------------ | 2 | Bob | -------------

我在一个SQLite数据库中有两个表,我正在通过PHP访问它
这是示例数据,足以描述我想做什么,但不能说明原因。
让我们调用这些表:
TableA
TableB
TableC

------------------------
|  Unique_ID  |  Name  |
------------------------
|  1          | Sam    |
------------------------
|  2          | Bob    |
------------------------
|  3          | Jill   |
------------------------

*Assume more rows for other possible foreign keys below
--------------------------------------------
|  Unique_ID  |  Foreign_Key  | Time_Stamp |
--------------------------------------------
|  1          | 1             | 1495298339 |
--------------------------------------------
|  2          | 1             | 1495298350 |
--------------------------------------------
|  3          | 1             | 1495298365 |
--------------------------------------------
我想要在我的输出中有这样的东西

------------------------------------
|  Name  | First_Time |  Last_Time |
------------------------------------
|  Sam   | 1495298339 | 1495298365 |
------------------------------------
|  Jill  | 1495298787 | 1495298805 |
------------------------------------
基本上,我想把第一个和最后一个时间戳拉到第一个表中,但我不确定如何执行连接行,或者如果可能的话,如何执行结果有限的多层select查询?


我希望有一种方法可以避免在
表格a
中循环遍历每个值,并在
表格B

中进行两次单独的查询以获取第一个(最低)和最后一个(最高)时间戳。您可以在第一个表格和第二个表格的处理版本之间进行联接。第二个表是使用
外键
的一组,计算值是
时间戳
的最小值和最大值。大概是这样的:

select A.Unique_Id, B.First_Time, B.Last_Time
from TableA as A
join (
    select Foreign_Key, min(Time_Stamp) as First_Time, max(Time_Stamp) as Last_Time
    from Table B
    group by Foreign_Key
) as B
on A.Unique_Id = B.Foreign_Key

您可以在第一个表和第二个表的已处理版本之间进行联接。第二个表是使用
外键
的一组,计算值是
时间戳
的最小值和最大值。大概是这样的:

select A.Unique_Id, B.First_Time, B.Last_Time
from TableA as A
join (
    select Foreign_Key, min(Time_Stamp) as First_Time, max(Time_Stamp) as Last_Time
    from Table B
    group by Foreign_Key
) as B
on A.Unique_Id = B.Foreign_Key
希望这对你有帮助

SELECT TableA.name, MIN(TableB.timeid), MAX(TableB.timeid) FROM TableA

INNER JOIN TableB ON TableA.id = TableB.TableA_id 

GROUP BY TableB.TableA_id

希望这能对您有所帮助。

其他两个相互竞争的答案是否会更有效,因为它们只是一个选择?由于您的答案更准确地执行了使用
AS
所要求的内容,同时还提供了表名,因此我将为您提供可接受的答案。由于查询优化器通常都很好,性能应该是相同的。但如果不是这样,最好先进行分组,将非常大的
表C
缩减为一个较小的表,每个用户有一个条目,然后在两个大小相似的表之间进行联接。如果首先执行联接,则会得到一个大小为
TableC
的表,由于联接,表中可能有许多行,因此必须将其减小到较小的大小。假设
TableB
有第四列(称之为
Location\u ID
)如果
Time\u Stamp
是min和max,那么有没有办法拉取该列,因为在同一个查询中有自己的列?其他两个相互竞争的答案是否会更有效,因为它们只是一个选择?由于您的答案更准确地执行了使用
AS
所要求的内容,同时还提供了表名,因此我将为您提供可接受的答案。由于查询优化器通常都很好,性能应该是相同的。但如果不是这样,最好先进行分组,将非常大的
表C
缩减为一个较小的表,每个用户有一个条目,然后在两个大小相似的表之间进行联接。如果首先执行联接,则会得到一个大小为
TableC
的表,由于联接,表中可能有许多行,因此必须将其减小到较小的大小。假设
TableB
有第四列(称之为
Location\u ID
)如果
Time\u Stamp
是min和max,有没有办法拉取该列,因为在同一查询中有自己的列?
SELECT TableA.name, MIN(TableB.timeid), MAX(TableB.timeid) FROM TableA

INNER JOIN TableB ON TableA.id = TableB.TableA_id 

GROUP BY TableB.TableA_id