Mysql 根据所选选项筛选查询
我正在尝试在我的应用程序中创建过滤器搜索,其中您有以下型号:Mysql 根据所选选项筛选查询,mysql,laravel,Mysql,Laravel,我正在尝试在我的应用程序中创建过滤器搜索,其中您有以下型号: 访客 属性响应 一个访问者可以有多个Attributeresponse用于保存详细信息,如姓名、姓氏、区域设置等 我正在努力实现的目标 如图所示,我希望检索具有Attributeresponse的访问者,其列名称为“name”,其值为“hector22”,同时列名称为“locale”,其值为“es” 换句话说,检索名为hector22、区域设置为es的访问者 这就是我目前在SQL中所拥有的: select * from
- 访客
- 属性响应
select
*
from
`visitors`
where
`bot_id` = '1255'
and exists (
select
*
from
`attributeresponses`
where
`visitors`.`id` = `attributeresponses`.`visitor_id`
and (
`attributeresponses`.`attribute_name` = 'name'
and `attributeresponses`.`value` = 'hector22'
)
and (
`attributeresponses`.`attribute_name` = 'locale'
and `attributeresponses`.`value` = 'es'
)
)
order by
`visitors`.`id` desc
limit
10 offset 0
这是在雄辩
// retrieve visitors related to filters
$visitors = Visitor::where('bot_id', $data['bot_id'] )
// ->with(['properties' => function($topQuery) use ($data, $filters) {
->whereHas('properties', function($query) use ($filters, $data) {
foreach( $filters as $key => $filter ){
$query->where(function($q) use ($filter) {
$q->where('attributeresponses.attribute_name', $filter['property'] );
if($filter['operator'] == 1){
// IS equal
$q->where('attributeresponses.value', $filter['value'] );
}else if($filter['operator'] == 2){
// IS NOT equal
$q->where('attributeresponses.value', '!=', $filter['value']);
}else if($filter['operator'] == 3 && (is_numeric($filter['value'])) ){
// IS greater than
$q->where('attributeresponses.value', '>', $filter['value']);
}else if($filter['operator'] == 4 && (is_numeric($filter['value'])) ){
// IS less than
$q->where('attributeresponses.value', '<', $data['filters']['value']);
}
});
}
})
->limit( 10 )
->offset( ( $data['paginate'] == 0 ? 0 : $data['paginate'] *10) )
->orderBy( 'visitors.id', 'desc' )
->get();
//检索与筛选器相关的访问者
$visitors=Visitor::where('bot\u id',$data['bot\u id'])
//->with(['properties'=>函数($topQuery)use($data,$filters){
->whereHas('properties',function($query)use($filters,$data){
foreach($filters as$key=>$filter){
$query->where(函数($q)使用($filter){
$q->where('attributeresponses.attribute_name',$filter['property']);
if($filter['operator']==1){
//平等
$q->where('attributeresponses.value',$filter['value']);
}else if($filter['operator']==2){
//不平等
$q->where('attributeresponses.value','!=',$filter['value']);
}如果($filter['operator']==3&&(是数值($filter['value'])){
//大于
$q->where('attributeresponses.value','>',$filter['value']);
}else如果($filter['operator']==4&&(是数值($filter['value'])){
//少于
$q->where('attributeresponses.value',”您当前的查询将尝试获取同时具有名称name
和locale
属性的访问者,这是不可能的,相反,您可以或如下所示:
// retrieve visitors related to filters
$visitors = Visitor::where('bot_id', $data['bot_id'] )
// ->with(['properties' => function($topQuery) use ($data, $filters) {
->whereHas('properties', function($query) use ($filters, $data) {
foreach( $filters as $key => $filter) {
$query->orWhere(function($q) use ($filter) {
$q->where('attributeresponses.attribute_name', $filter['property'] );
if($filter['operator'] == 1){
// IS equal
$q->where('attributeresponses.value', $filter['value'] );
}else if($filter['operator'] == 2){
// IS NOT equal
$q->where('attributeresponses.value', '!=', $filter['value']);
}else if($filter['operator'] == 3 && (is_numeric($filter['value'])) ){
// IS greater than
$q->where('attributeresponses.value', '>', $filter['value']);
}else if($filter['operator'] == 4 && (is_numeric($filter['value'])) ){
// IS less than
$q->where('attributeresponses.value', '<', $data['filters']['value']);
}
});
}
}, count($filters));
->limit( 10 )
->offset( ( $data['paginate'] == 0 ? 0 : $data['paginate'] *10) )
->orderBy( 'visitors.id', 'desc' )
->get();
//检索与筛选器相关的访问者
$visitors=Visitor::where('bot\u id',$data['bot\u id'])
//->with(['properties'=>函数($topQuery)use($data,$filters){
->whereHas('properties',函数($query)使用($filters,$data){
foreach($filters as$key=>$filter){
$query->orWhere(函数($q)使用($filter){
$q->where('attributeresponses.attribute_name',$filter['property']);
if($filter['operator']==1){
//平等
$q->where('attributeresponses.value',$filter['value']);
}else if($filter['operator']==2){
//不平等
$q->where('attributeresponses.value','!=',$filter['value']);
}如果($filter['operator']==3&&(是数值($filter['value'])){
//大于
$q->where('attributeresponses.value','>',$filter['value']);
}else如果($filter['operator']==4&&(是数值($filter['value'])){
//少于
$q->where('attributeresponses.value','未经测试(显然),但只是需要考虑一下
select v.*
from visitors v
join attributeresponses r
on r.visitor_id = v.id
where v.bot_id = 1255
and (r.attribute_name,r.value) IN (('name','hector22'),('locale','es'))
Group
by v.id
having Count(distinct (r.attribute_name,r.value)) = 2
order
by v.id desc
limit 10
offset 0
谢谢!我感谢你的帮助,到目前为止它是有效的!我感谢你的帮助,如果我放置草莓提到的having条款,它似乎有效!