gpt4 book ai didi

php - mysql 查询 IN 语句变得不可预测

转载 作者:行者123 更新时间:2023-11-29 11:47:49 25 4
gpt4 key购买 nike

我用逗号分隔的字符串中的三列存储所有注册用户的可用性,如下所示:

user 1:
teaching: english

morning = '';
afternoon = 'Thrs,Fri,Sat,Sun';
evening = 'Thrs,Fri,Sat,Sun';

User 2
teaching: english

morning = 'Sat';
afternoon = 'Sat,Sun,Fri';
evening = 'Sat,Sun,Fri';

假设我正在寻找周六下午和晚上有空的导师。我认为查询会返回它们,因为用户的下午和晚上列都有“星期六”。但它返回空数组。

这是我的浏览器解释的查询。我在 phpmyadmin 中运行了这个,但没有返回任何结果。

SELECT * , (3956 * 2 * ASIN(SQRT( POWER(SIN(('2.993518' - lat) * pi()/180 / 2), 2) +COS('2.993518' * pi()/180) * COS(lat * pi()/180) * POWER(SIN(('101.7874058' - lon) * pi()/180 / 2), 2) ))) as distance from posts WHERE posts.subname LIKE '%english%' AND posts.pricing <= '115' AND (posts.afternoon IN ('Sat') OR posts.evening IN ('Sat')) GROUP BY posts.UUID having distance <= '40' order by distance

以同样的方式,我试图寻找“周四”下午和晚上有空的用户。我想它应该返回 user1,因为只有 user1 在星期四可用,但它不返回任何结果:

SELECT * , (3956 * 2 * ASIN(SQRT( POWER(SIN(('2.993518' - lat) * pi()/180 / 2), 2) +COS('2.993518' * pi()/180) * COS(lat * pi()/180) * POWER(SIN(('101.7874058' - lon) * pi()/180 / 2), 2) ))) as distance from posts WHERE posts.subname LIKE '%flute%' AND posts.pricing <= '115' AND (posts.afternoon IN ('Thrs') OR posts.evening IN ('Thrs')) GROUP BY posts.UUID having distance <= '40' order by distance

那么它到底什么时候返回结果?

当我搜索 Saturday 的早上、下午和晚上时。我只是不明白这个查询如何执行搜索。为什么我没有得到预期的结果,我的错误在哪里?如果有人帮助我的话将会很有帮助,因为我已经在这上面浪费了很多天了!

上述内容的完整 PHP 代码:

<?php
JSON formatted data received via ajax
$return = '{"avail":["Wed-2,Thrs-2","Thrs-3"]}';

In the above -1 means for monrning, -2 for afternoon and -3 for evening.I'm categorising them below.'
$avail = $data['avail'];
$days = array();
$cols = array();

$size = sizeof($avail);
if(($avail != "")&&($size > 1)){
$periods = array();
foreach($avail as $v){
list($day, $column) = explode("-", $v); // make sure you validated the data to avoid errors
$periods[$column][] = "'" . mysql_escape_string($day) . "'"; //strtolower// PHP would automatically create an empty array if $periods[$column] was not defined
}
$intToCol = array(1 => "morning", 2 => "afternoon", 3 => "evening");
// $periods should now be identical to ["2" => ["'sun'", "'mon'"], "3" => ["'sun'"]]

$conditions = array();
foreach($periods as $int => $days){
$dayString = implode(",", $days);
$conditions[] = " FIND_IN_SET ($dayString, posts." . $intToCol[$int].")" ;
}
$add_here = "AND (" . implode(" OR ", $conditions) . ")";
}else if(($avail != "")&&($size == 1))
{
foreach($avail as $k=>$v)
{
$v;

$array = explode('-', $v);
$day =$array[0]; // Wed
$column = $array[1]; // 2

if($column == 1)
{
$col = "morning";

}
if($column == 2)
{
$col = "afternoon";
}
if($column == 3)
{
$col = "evening";
}

}

$add_here = " posts.".$col." = '".$day."' ";

$sql = "SELECT * , (3956 * 2 * ASIN(SQRT( POWER(SIN(('$lat' - lat) * pi()/180 / 2), 2) +COS('$lat' * pi()/180) * COS(lat * pi()/180) * POWER(SIN(('$lon' - lon) * pi()/180 / 2), 2) ))) as distance from posts WHERE posts.subname LIKE '%$subject%' AND posts.pricing <= '$rate' ".$add_here."".$IsTutionCentre." GROUP BY posts.UUID having distance <= '$distance' order by distance";

$stmt =connection::$pdo->prepare($sql);
$stmt->execute();
$place=array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$place[] = $row;
}
$_SESSION['subject'] = $place;

//send back to ajax call made page
echo json_encode($place);
}
?>

最佳答案

afternoon = 'Thrs,Fri,Sat,Sun';
evening = 'Thrs,Fri,Sat,Sun';

当一组值以 csv 形式存储在单行字段中时,使用 'IN'是行不通的。您必须使用 ' FIND_IN_SET '

更改:

AND (posts.afternoon IN ('Sat') OR posts.evening IN ('Sat'))

:

AND (    FIND_IN_SET( 'Sat', posts.afternoon )
OR FIND_IN_SET( 'Sat', posts.evening ) )

您可以对其他日期的事件应用相同的方法。

文档引用:
<强> FIND_IN_SET(str,strlist) :

  • 如果字符串 str 位于字符串中,则返回 1 到 N 之间的值字符串列表 strlist 由 N 个子字符串组成。字符串列表是由“,”字符分隔的子字符串组成的字符串。如果第一个参数是常量字符串,第二个参数是一列类型 SET,FIND_IN_SET() 函数经过优化以使用位算术。如果 str 不在 strlist 中或 strlist 是则返回 0空字符串。如果任一参数为 NULL,则返回 NULL。这个功能如果第一个参数包含逗号(“,”),则无法正常工作性格。

关于php - mysql 查询 IN 语句变得不可预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34608656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com