从各种表中选择,带有索引列表

时间:2009-09-01 21:38:17

标签: php mysql

以下是该方案。

我正在开发一个时钟系统;我有这些表:

-punch (id_punch,date)
-in1 (id_in1,time,id_punch,...)
-in2 (id_in2,time,id_punch,...)
.
-in6  (id_in6,time,id_punch,...)
-out1 (id_out1,time,id_punch,...)
-out2 (id_out2,time,id_punch,...)
.
-out6 (id_out6,time,id_punch,...)

我的问题是,如何在PHP中只使用一个查询从id_punch值列表中获取进出表中的所有值,例如:

获得9月的所有优势,或者 获得7月到12月的所有优势,

我的意思是......从两个日期之间的id_punch列表中,从in,out表中获取所有结果。

我认为唯一的方法是使用每个id_punch变量进行查询,但是在一个月内它的大约20-25个查询...到很多?

4 个答案:

答案 0 :(得分:1)

要获取表格中的所有数据,您需要使用JOIN MySQL JOIN加入这些数据 但是通过查看你的表格我可以收集到的内容,你可能应该考虑将它变成一个表而不是你在这里的多个表。

答案 1 :(得分:1)

您确实需要将所有输入/输出数据存储在一个punch的子表中:

CREATE TABLE punch (
  id_punch SERIAL PRIMARY KEY,
  punch_date DATE NOT NULL,
  ip_address INT UNSIGNED NOT NULL
  -- plus other attributes
) ENGINE=InnoDB;

CREATE TABLE inout (
  id_punch BIGINT UNSIGNED,
  in_time TIME NOT NULL,
  out_time TIME NULL,
  PRIMARY KEY (id_punch, in_time),
  FOREIGN KEY (id_punch) REFERENCES punch (id_punch)
) ENGINE=InnoDB;

现在,您可以非常轻松地查询9月份的所有拳击事件:

SELECT *
FROM punch LEFT OUTER JOIN inout USING (id_punch)
WHERE EXTRACT(YEAR_MONTH FROM punch_date) = '200909';

答案 2 :(得分:0)

你的数据库模式有点不清楚,但如果你问如何获得对应于你已经拥有的id列表的结果,这应该有用(假设你的id是1,3,5,7,9)< / p>

SELECT * FROM table1, table2, table 3
WHERE table1.punch_id = table2.punch_id AND table2.punch_id = table3.punch_id AND table3.punch_id IN (1,3,5,7,9)

您可能需要修改它,只需确保每个表的punch_id都加入到该IN约束中

答案 3 :(得分:0)

我不能使用一个表因为我在每个打卡中都有一些信息,如ipaddress和其他信息。

Neil,答案在我的鼻子里,我已经看到了像你这样的解决方案,但我怀疑的是如何将列表放在查询中,回答我自己的问题=在php中使用foreach()来“填充”这个清单......

类似的东西:

> SELECT * FROM table1, table2, table 3 WHERE table1.punch_id = table2.punch_id AND table2.punch_id = table3.punch_id AND table3.punch_id IN (<? foreach($query->results() as $row) echo $row->id_punch;?>)

即时通讯使用codeigniter