从两个表中选择复杂的MYSQL查询

时间:2018-02-20 20:22:36

标签: mysql

我需要执行MYSQL查询以从“table_in”中选择具有与table_1相同格式的用户

 table_1
 id  Field_id  user_id  value
 1      9        1     "hello"
 2      10       1     "Multi"
 3      9        2     "Something"
 4      10       2     "Single"

 table_2
 id  user_id  status        specs
 1      1     "Busy"       "this is a test"
 2      2     "Idle"       "this is another test"
 3      2     "Busy"       "another test again"
 4      1     "Relaxing"   "something else"

我需要从table_in中选择用户,其中以下任一项为真

  1. table_1 field_id = 10包含“Multi”
  2. table_2状态不忙“
  3. 然后将结果保存在新表table_out

    所以到目前为止我得到的是

      CREATE TEMPORARY TABLE table_out
        SELECT * FROM table_1 WHERE user_id in (SELECT user_id from table_in) 
        AND (field_id=10 AND value='Multi')
        OR (SELECT * from table_2 where status!='Busy')
    

    我不是SQL专家,我上面的MY-SQL语句不起作用。我想也许最后的OR语句是错误的,它试图从table_2中选择状态不忙。

    所以基本上放入table_out的用户必须全部来自“table_in”,并且(字段10设置为多个)或table_2中的相同用户(状态!=忙碌)

    有人知道怎么做吗?

    更新: 找到了自己的解决方案使用table_in,通过仅选择那些非“多”的值来创建第二个表,然后从那个查询table_2中为那些非忙的user_id将其放在另一个表中,然后从table_in中删除这些值。

    非常感谢

4 个答案:

答案 0 :(得分:1)

您可以使用union语句尝试它。 我这里没有任何mysql数据库来测试它,但它应该看起来像那样

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class PropertyAdvert extends Model
{
     protected $fillable = ["photo", "address", "county", "town","type","rent","date","bedrooms","bathrooms","furnished","description",];
}

如果我的问题是对的:)

答案 1 :(得分:0)

从我所看到的......也许这样的东西会起作用......当然,我是SQL Server,但我认为这适用于MySQL。

{{1}}

答案 2 :(得分:0)

您必须使用UNION ALL运算符。

UNION运算符用于组合两个或多个SELECT语句的结果集。

  • UNION中的每个SELECT语句必须具有相同的编号 列
  • 列也必须具有类似的数据类型

  • 每个SELECT语句中的列也必须采用相同的顺序。

    CREATE TEMPORARY TABLE table_out
    SELECT * FROM table_1 WHERE user_id in (SELECT user_id from table_in) AND (field_id=10 AND value='Multi')
    
  

UNION运算符默认情况下仅选择不同的值。允许   重复值,使用UNION ALL

UNION ALL
    SELECT t2.id, t_in.field_id, t2.user_id, t_in.value
    FROM table_2 AS t2
    INNER JOIN table_in AS t_in
    ON t2.user_id = t_in.user_id
    WHERE t2.status != 'Busy';

答案 3 :(得分:0)

我认为您会发现这符合您的需求:

SELECT *
  FROM table_in ti
  INNER JOIN table_1 t1
    ON t1.user_id = ti.user_id
  LEFT OUTER JOIN table_2 t2
    ON t2.USER_ID = ti.USER_ID
  WHERE (t1.field_id = 10 AND t1.value = 'Multi') OR
        t2.status <> 'Busy'

按预期table_2进行此工作应该是外部(可选)连接。实际上,由于我没有完全掌握问题,因此很可能是桌子2和桌面2应该是外连接。嗯,这对你来说更进一步。

我必须做出一些假设,我将其封装在this SQLFiddle中。请注意,在小提琴中,我只填充了table_inuser_id为1,只是为了测试它。根据需要改变它以进一步测试。

祝你好运。

修改

小提琴的代码是:

create table table_in(user_id int);

insert into table_in(user_id) values (1);



create table table_1(id int, field_id int, user_id int, value varchar(20));

 insert into table_1 (id,  Field_id,  user_id,  value) values (1,      9 ,       1,     'hello');
 insert into table_1 (id,  Field_id,  user_id,  value) values (2,      10,       1,     'Multi');
 insert into table_1 (id,  Field_id,  user_id,  value) values (3,      9 ,       2,     'Something');
 insert into table_1 (id,  Field_id,  user_id,  value) values (4,      10,       2,     'Single');

 create table table_2 (id int, user_id int, status varchar(10), specs varchar(25));

insert into table_2(id,  user_id,  status, specs) value (1,      1,     'Busy'     ,  'this is a test');
insert into table_2(id,  user_id,  status, specs) value ( 2,      2,     'Idle'     ,  'this is another test');
insert into table_2(id,  user_id,  status, specs) value ( 3,      2,     'Busy'     ,  'another test again');
insert into table_2(id,  user_id,  status, specs) value ( 4,      1,     'Relaxing' ,  'something else');

把它放在这里因为SQLFiddle似乎像今天的乒乓球一样上下线。 : - (