以下是该方案。
我正在开发一个时钟系统;我有这些表:
-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个查询...到很多?
答案 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