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