多个字段 – 永夜 https://www.shuijingwanwq.com 没有不值得去解决的问题,也没有不值得去学习的技术! Sat, 01 Jun 2024 08:23:02 +0000 zh-Hans hourly 1 https://wordpress.org/?v=7.0 在 MySQL 8 中,in 条件用于多个字段,查询结果为空的排查 https://www.shuijingwanwq.com/2024/06/01/8613/ https://www.shuijingwanwq.com/2024/06/01/8613/#respond Sat, 01 Jun 2024 08:23:02 +0000 https://www.shuijingwanwq.com/?p=8613 Post Views: 87 1、在 MySQL 8 中,in 条件用于多个字段,查询结果为空。如图1
在 MySQL 8 中,in 条件用于多个字段,查询结果为空

图1



SELECT
	`id`,
	`name`,
	`email`,
	`type` 
FROM
	`customers` 
WHERE
	( 'name,email' ) IN ( '(\'客户姓名二\',\'44445@163.com\'),(\'客户姓名\',\'44445@163.com\')' ) 
ORDER BY
	`id` DESC


2、参考:在 MySQL 8 中,in 条件用于多个字段  查询结果不为空的 SQL 如下


SELECT * FROM `customers` WHERE ( NAME, email ) IN (( '123', '123@outlook.com' ),
( '我是客户姓名33', '1303842899@qq.com' ))


3、参考:在 Laravel 9 中使用原生表达查询时,报错:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;  调整代码,打印绑定参数,符合预期,没有问题。如图2
参考:在 Laravel 9 中使用原生表达查询时,报错:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;

图2



$str = '';
foreach ($criteria['whereRawIn'][1] as $key => $customer) {
	$str .= ($key == 0) ? '(\'' : ',(\'';
	$str .= implode('\',\'', $customer) . '\')';
}

var_dump($criteria['whereRawIn'][0]);
var_dump($str);
exit;




string(10) "name,email"
string(2959) "('客户姓名二','44445@163.com'),('客户姓名','44445@163.com')"


4、调整代码实现如下


            $str = '';
            foreach ($criteria['whereRawIn'][1] as $key => $customer) {
                $str .= ($key == 0) ? '(\'' : ',(\'';
                $str .= implode('\',\'', $customer) . '\')';
            }

//            var_dump('(' . $criteria['whereRawIn'][0] . ')');
//            var_dump('(' . $str . ')');
//            exit;

            $builder->whereRaw('? in ?', ['(' . $criteria['whereRawIn'][0] . ')', '(' . $str . ')']);


5、运行时报错:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘? order by `id` desc’ at line 1 。如图3
运行时报错:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? order by `id` desc' at line 1 。

图3

6、但是,将报错的 SQL 复制到数据库中,手动执行,执行成功。如图4
但是,将报错的 SQL 复制到数据库中,手动执行,执行成功

图4

7、调整代码实现如下,运行时报错:SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 2 column(s) 。但是,将报错的 SQL 复制到数据库中,手动执行,执行成功。如图5
调整代码实现如下,运行时报错:SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 2 column(s) 。但是,将报错的 SQL 复制到数据库中,手动执行,执行成功

图5



            $str = '';
            foreach ($criteria['whereRawIn'][1] as $key => $customer) {
                $str .= ($key == 0) ? '(\'' : ',(\'';
                $str .= implode('\',\'', $customer) . '\')';
            }

//            var_dump('(' . $criteria['whereRawIn'][0] . ')');
//            var_dump('(' . $str . ')');
//            exit;

            // $builder->whereRaw('? in ?', ['(' . $criteria['whereRawIn'][0] . ')', '(' . $str . ')']);
			$builder->whereRaw('(?,?) in (?)', ['name', 'email', $str]);
            // $builder->whereRaw('( ' . $criteria['whereRawIn'][0] . ' ) in (?)', [$str]);


8、最终决定放弃此 SQL,调整为另外一种 SQL 格式。代码实现如下,生成 SQL 如下,程序运行时不再报错,查询结果符合预期。如图6
最终决定放弃此 SQL,调整为另外一种 SQL 格式。代码实现如下,生成 SQL 如下,程序运行时不再报错,查询结果符合预期

图6



foreach ($criteria['names_emails'] as $customer) {
	$builder->orWhere(function ($query) use ($customer) {
		$query->where('name', $customer[0])
			->where('email', $customer[1]);
	});
}




SELECT
	`id`,
	`name`,
	`email`,
	`type` 
FROM
	`customers` 
WHERE
	( `name` = '客户姓名二' AND `email` = '客户姓名二' ) 
	OR ( `name` = '客户姓名' AND `email` = '客户姓名' )
ORDER BY
	`id` DESC


]]>
https://www.shuijingwanwq.com/2024/06/01/8613/feed/ 0
在 Laravel 9 中使用原生表达查询时,in 条件用于多个字段 https://www.shuijingwanwq.com/2024/03/19/8473/ https://www.shuijingwanwq.com/2024/03/19/8473/#comments Tue, 19 Mar 2024 01:49:24 +0000 https://www.shuijingwanwq.com/?p=8473 Post Views: 109 1、参考:在 MySQL 8 中,in 条件用于多个字段 。


SELECT * FROM `customers` WHERE ( name, email ) IN (( '123', '123@outlook.com' ),
( '我是客户姓名33', '1303842899@qq.com' ))


2、需要在 Laravel 9 中使用原生表达查询时,in 条件用于多个字段。whereRaw 和 orWhereRaw 方法将原生的「where」注入到你的查询中。


$customers = DB::table('customers')
	->whereRaw('email in ?', ['(\'123@outlook.com\', \'12414dfgfdg@78.com\')'])
	->get();
print_r($customers);exit;


3、执行报错:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘?’ at line 1 。如图1
执行报错:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1

图1



"message": "SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1 (SQL: select * from `customers` where email in ('123@outlook.com', '12414dfgfdg@78.com'))",


4、不再使用 ?,而是直接拼接出原生 SQL。查询成功。如图2
不再使用 ?,而是直接拼接出原生 SQL。查询成功

图2



$customers = DB::table('customers')
	->whereRaw('email in (\'123@outlook.com\', \'12414dfgfdg@78.com\')')
	->get();
print_r($customers);exit;


5、再次调整,以使 in 条件用于多个字段。查询成功。如图3
再次调整,以使 in 条件用于多个字段。查询成功

图3



$queryBuilder = app('Modules\Order\Models\Customer')::query();
$customers = $builder->whereRaw('(name,email) in ((\'123\',\'123@outlook.com\'),(\'我是客户姓名33\',\'1303842899@qq.com\'))')
	->get();
print_r($customers);exit;




$queryBuilder = app('Modules\Order\Models\Customer')::query();
print_r($criteria['customers']);
$str = '';
foreach ($criteria['customers'] as $key => $customer) {
	$str .= ($key == 0) ? '(\'' : ',(\'';
	$str .= implode('\',\'', $customer) . '\')';
}
print_r($str);
$customers = $builder->whereRaw('(name,email) in (' . $str . ')')->get();
print_r($customers);exit;


6、查看生成的 SQL,符合预期。如图4
查看生成的 SQL,符合预期

图4



select
  `id`,
  `name`,
  `email`,
  `type`
from
  `customers`
where
  (name, email) in (
    ('王某人', '44445@163.com'),
    ('客户姓名', '44445@163.com'),
    ('王某某', '4444@163.com'),
    ('王某某', '44445@163.com'),
    ('李某某', '4444@163.com'),
    ('客户姓名', '4444@163.com')
  )
order by
  `id` desc


7、后续发现 SQL 报错,具体可参考:在 Laravel 9 中使用原生表达查询时,报错:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; 。]]>
https://www.shuijingwanwq.com/2024/03/19/8473/feed/ 2
在 MySQL 8 中,in 条件用于多个字段 https://www.shuijingwanwq.com/2024/03/13/8470/ https://www.shuijingwanwq.com/2024/03/13/8470/#comments Wed, 13 Mar 2024 01:28:41 +0000 https://www.shuijingwanwq.com/?p=8470 Post Views: 107 1、在 B 表没有 A 表的主键ID,但是存在 A 表的其他2个字段。现在计划基于 A 表的其他2个字段,查询出 A 表中的记录。计划使用 in 条件。一般的标准用法如下所示


select * from `shops` where `id` in (14, 1, 21, 54, 55, 23, 49, 56)


2、尝试将 in 条件用于多个字段。查询成功,符合预期。如图1
尝试将 in 条件用于多个字段。查询成功,符合预期

图1



SELECT * FROM `customers` WHERE ( name, email ) IN (( '123', '123@outlook.com' ),
( '我是客户姓名33', '1303842899@qq.com' ))


]]>
https://www.shuijingwanwq.com/2024/03/13/8470/feed/ 2