一对多查询的疑问
发布于:2022-01-17 09:50:54
#1 slyjit
user 用户表user_id int 用户ID 自增/主键
user_name varchar(50) 用户名 唯一
guestbook 留言表gb_id int 留言ID 自增/主键
contents varchar(255) 留言内容
user_id int 对应的用户ID
creates varchar 留言时间我在留言表新增加了个字段creates;
现在我想查询的数据是:user表里面user_id=1的 留言时间是在今日10点至11点的留言
实现:通过修改user表的模型添加:
var $linker = array( array( 'type' => 'hasmany', // 一对多关联 'map' => 'guestbook', // 关联的标识 'mapkey' => 'user_id', 'fclass' => 'guestbook', 'fkey' => 'user_id', 'condition' => 'creates >= 1433142879 AND creates < 1433142880', 'enabled' => true ), );这样就可以实现了,但我有可能查询当日10点至11点的留言 也有可能会查11点至12点的留言,时间段不固定,这个要如何动态传值呢?
jake论坛验证码太坑了,用汉字做验证码还是百度的方法比较好 用两个词组,你这两个不相关的字 真是麻烦打
2015-06-02 14:19:04
#2 slyjit
哎呀 关联数组乱了
var $linker = array(
array(
'type' => 'hasmany', // 一对多关联
'map' => 'guestbook', // 关联的标识
'mapkey' => 'user_id',
'fclass' => 'guestbook',
'fkey' => 'user_id',
'condition' => 'creates >= 1433142879 AND creates < 1433142880',
'enabled' => true
),
);
2015-06-02 14:20:49
#3 slyjit
$business_model = spClass('user');
$linker = $business_model->linker;
$linker[0]['condition'] = 'creates >= '.$start.' AND creates < '.$end;
$business_model->linker = $linker;
解决了 这样写 可以实现;不知道还有没有别的好法子
2015-06-02 14:39:19
#4 slyjit
发现个问题 我打印sql语句的时候 :
SELECT * FROM guestbook WHERE user_id = 'D013345' AND creates >= 1427817600 AND creates < 1430409600 ORDER BY id ;
如果我想一次性将user表的用户都查询出来,并且也查出对应的留言,SP框架是不是通过遍历user的数据 然后再组织如上的SQL语句再查询留言?如果是这样的话 user表的数据少还好说 如果达到一定数量级,那么会不会对mysql造成很大的压力啊?
2015-06-02 14:47:00
#5 jake
1. 关联上面你做对了,就是这个方法。
2. 其实我更推荐做复杂,或大数据的关联,直接用join之类的SQL语句直接查,一般现在大系统也都是那样的,好处是意图明显,而且维护简单,优化也简单。
3. discuz论坛就只有这种验证码,也是比较靠谱的,木有什么好办法。发超过5贴就不用验证码了~~~
2015-06-02 15:45:31
#6 slyjit
长远考虑 改为sql语句写了
2015-06-02 16:36:03