【问题标题】:Retrieve and combining similar items in mysql在mysql中检索和组合相似的项目
【发布时间】:2015-04-10 12:13:34
【问题描述】:

我有一个重大的困境。我有一个搜索,它根据用户搜索或用户单击类别来填充搜索。当进行搜索或单击业务或领导力等类别时,会出现子类别。

我希望发生以下行为: 当您单击特定的子类别时,它会减少结果的数量。比如说结果是 100,你点击 html,它会是 10,但是假设你检查了多个子类别,然后子类别被加在一起,所以假设 html 有 10 门课程,然后 css 30,然后你点击将显示超过 40 个。

在当前状态下,它不会组合它们,而是只考虑最后一个复选框被选中,例如,如果 html 被选中然后 css,它只会在两者都考虑时才查看 css。

以下是涵盖子类别的部分:

//sub categories
 $sub1Arr = array();
if (!empty($category1)) $sub1Arr[] = $category1;
if (count($sub1Arr)>0) {

   $get_crs_mysqli_count .= " AND  (course_subc1 IN ('".implode("','", $sub1Arr)."')) ";

 }

  $sub2Arr = array();
if (!empty($category2)) $sub2Arr[] = $category2;
if (count($sub2Arr)>0) {

  $get_crs_mysqli_count .= " AND  (course_subc2 IN ('".implode("','", $sub2Arr)."')) ";
 }

  $sub3Arr = array();
if (!empty($category3)) $sub3Arr[] = $category3;
if (count($sub3Arr)>0) {

    $get_crs_mysqli_count .= " AND  (course_subc3 IN ('".implode("','", $sub3Arr)."')) ";
 }

  $sub4Arr = array();
if (!empty($category4)) $sub4Arr[] = $category4;
if (count($sub4Arr)>0) {

  $get_crs_mysqli_count .= " AND  (course_subc4 IN ('".implode("','", $sub4Arr)."')) ";
 }
   $sub5Arr = array();
if (!empty($category5)) $sub5Arr[] = $category5;
if (count($sub5Arr)>0) {

    $get_crs_mysqli_count .= " AND  (course_subc5 IN ('".implode("','", $sub5Arr)."')) ";
 }

下面是大部分代码:

$get_crs_mysqli_count = "
    SELECT * 
    FROM courses 
    WHERE course_date1 >= CURRENT_DATE() ";
    if(!empty($_SESSION['userSearch']))
{
    $get_crs_mysqli_count .= " AND (course_title like '%" . $_SESSION['userSearch'] . "%') ";
}
elseif(!empty($_SESSION['userCategory']))
{
   $get_crs_mysqli_count .= " AND ((course_cat1 like '%" . $_SESSION['userCategory'] . "%') OR (course_cat2 like '%" . $_SESSION['userCategory'] . "%')) ";

}

elseif(!empty($_SESSION['userDate']))
{
   $get_crs_mysqli_count .= " AND ((course_date1 like '%" . $_SESSION['userDate'] . "%') OR (course_date2 like '%" . $_SESSION['userDate'] . "%')) ";

}

elseif(!empty($_SESSION['userProvider']))
{
   $get_crs_mysqli_count .= " AND (course_provider like '%" . $_SESSION['userProvider'] . "%') ";

}

elseif(!empty($_SESSION['userCity']))
{
    $get_crs_mysqli_count .= " AND (course_city like '%" . $_SESSION['userCity'] . "%') ";

}

elseif(!empty($_SESSION['userPrice']))
{
   $get_crs_mysqli_count .= " AND (course_price like '%" . $_SESSION['userPrice'] . "%') ";
}

elseif(!empty($_SESSION['userSub']))
{
    $get_crs_mysqli_count .= " AND ((course_subc1 like '%" . $_SESSION['userSub'] . "%') OR (course_subc2 like '%" . $_SESSION['userSub'] . "%') or  (course_subc3 like '%" . $_SESSION['userSub'] . "%') or (course_subc4 like '%" . $_SESSION['userSub'] . "%') or  (course_subc5 like '%" . $_SESSION['userSub'] . "%')) ";

}



$durationArr = array();
if (!empty($duration1)) $durationArr[] = $duration1;
if (!empty($duration2)) $durationArr[] = $duration2;
if (!empty($duration3)) $durationArr[] = $duration3;
if (!empty($duration4)) $durationArr[] = $duration4;
if (!empty($duration5)) $durationArr[] = $duration5;
if (count($durationArr)>0) {
   $get_crs_mysqli_count .= " AND  (course_duration IN ('".implode("','", $durationArr)."')) ";
 }

 //From Price
  $fromPriceArr = array();
if (!empty($fromPrice)) $fromPriceArr[] = $fromPrice;
if (count($fromPriceArr)>0) {

    $get_crs_mysqli_count .= " AND  (course_priceFinal >= ('".implode("','", $fromPriceArr)."')) ";
 }


//To Price
  $toPriceArr = array();
if (!empty($toPrice)) $toPriceArr[] = $toPrice;
if (count($toPriceArr)>0) {

    $get_crs_mysqli_count .= " AND  (course_priceFinal <= ('".implode("','", $toPriceArr)."')) ";
 }

//start date
  $startArr = array();
if (!empty($startDate)) $startArr[] = $startDate;
if (count($startArr)>0) {

    $get_crs_mysqli_count .= " AND  (course_date1 >= ('".implode("','", $startArr)."')) ";
 }

//end date
  $endArr = array();
if (!empty($endDate)) $endArr[] = $endDate;
if (count($endArr)>0) {

    $get_crs_mysqli_count .= " AND  (course_date1 <= ('".implode("','", $endArr)."')) ";
 }


//sub categories
 $sub1Arr = array();
if (!empty($category1)) $sub1Arr[] = $category1;
if (count($sub1Arr)>0) {

   $get_crs_mysqli_count .= " AND  (course_subc1 IN ('".implode("','", $sub1Arr)."')) ";

 }

  $sub2Arr = array();
if (!empty($category2)) $sub2Arr[] = $category2;
if (count($sub2Arr)>0) {

  $get_crs_mysqli_count .= " AND  (course_subc2 IN ('".implode("','", $sub2Arr)."')) ";
 }

  $sub3Arr = array();
if (!empty($category3)) $sub3Arr[] = $category3;
if (count($sub3Arr)>0) {

    $get_crs_mysqli_count .= " AND  (course_subc3 IN ('".implode("','", $sub3Arr)."')) ";
 }

  $sub4Arr = array();
if (!empty($category4)) $sub4Arr[] = $category4;
if (count($sub4Arr)>0) {

  $get_crs_mysqli_count .= " AND  (course_subc4 IN ('".implode("','", $sub4Arr)."')) ";
 }
   $sub5Arr = array();
if (!empty($category5)) $sub5Arr[] = $category5;
if (count($sub5Arr)>0) {

    $get_crs_mysqli_count .= " AND  (course_subc5 IN ('".implode("','", $sub5Arr)."')) ";
 }


//city
  $cityArr = array();
if (!empty($city)) $cityArr[] = $city;
if (count($cityArr)>0) {

    $get_crs_mysqli_count .= " AND  (course_city IN ('".implode("','", $cityArr)."')) ";
 }

//delivery
   $delivery1Arr = array();
if (!empty($delivery1)) $delivery1Arr[] = $delivery1;
if (count($delivery1Arr)>0) {

   $get_crs_mysqli_count .= " AND  (course_delivery IN ('".implode("','", $delivery1Arr)."')) ";
 }

   $delivery2Arr = array();
if (!empty($delivery2)) $delivery2Arr[] = $delivery2;
if (count($delivery2Arr)>0) {

    $get_crs_mysqli_count .= " AND  (course_delivery2 IN ('".implode("','", $delivery2Arr)."')) ";
 }

 //provider

$providerArr = array();
if (!empty($provider1)) $providerArr[] = $provider1;
if (!empty($provider2)) $providerArr[] = $provider2;
if (!empty($provider3)) $providerArr[] = $provider3;
if (!empty($provider4)) $providerArr[] = $provider4;
if (!empty($provider5)) $providerArr[] = $provider5;

if (count($providerArr)>0) {
    $get_crs_mysqli_count .= " AND  (course_provider IN ('".implode("','", $providerArr)."')) ";
 }


$guaranteeArr = array();
if (!empty($guarantee1)) $guaranteeArr[] = $guarantee1;
if (!empty($guarantee2)) $guaranteeArr[] = $guarantee2;
if (count($guaranteeArr)>0) {
    $get_crs_mysqli_count.= " AND  (course_guarantee IN ('".implode("','", $guaranteeArr)."')) ";
 }


$get_crs_mysqli_count .= "
    ORDER BY course_date1 ASC ";

请注意,子类别与其他过滤器协同工作至关重要。

更新:

//sub categories
 $sub1Arr = array();
  $sub2Arr = array();

 $sub3Arr = array();

 $sub4Arr = array();

 $sub5Arr = array();

if (!empty($category1)) $sub1Arr[] = $category1;
if (!empty($category2)) $sub2Arr[] = $category2;
if (!empty($category3)) $sub3Arr[] = $category3;
if (!empty($category4)) $sub4Arr[] = $category4;
if (!empty($category5)) $sub5Arr[] = $category5;



if (count($sub1Arr)>0) {

   $get_crs_mysqli_count .= " AND  ((course_subc1 IN ('".implode("','", $sub1Arr)."')) OR  (course_subc2 IN ('".implode("','", $sub2Arr)."'))
   or (course_subc3 IN ('".implode("','", $sub3Arr)."')) or  (course_subc4 IN ('".implode("','", $sub4Arr)."'))  or (course_subc5 IN ('".implode("','", $sub5Arr)."')))";

 }

【问题讨论】:

    标签: php mysql sql search mysqli


    【解决方案1】:

    如果要合并多个类别,则不能使用AND。请改用OR。它与您用于子类别的IN 几乎相同。

    基本上,您的查询应该如下所示:

    SELECT * FROM courses WHERE course_date1 >= CURRENT_DATE() AND (course_title like '%<something>%') AND (...) AND (
        (course_subc1 IN (<sub1Arr>) OR course_subc2 IN (<sub2Arr>) OR (...)
    )
    

    请注意类别之间的OR...

    【讨论】:

    • 感谢您的建议。我按照建议使用 or 代替,但它似乎对结果没有任何影响(现在结果是 9,当检查时保持 9)所以我猜我的查询可能有问题。我在我的初始帖子下添加了一个更新
    • 退回哪些商品?只有来自特定类别或子类别的项目?您应用了哪些附加限制?您可以发布生成的$get_crs_mysqli_count 变量内容吗?也许这有帮助?
    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2013-12-19
    相关资源
    最近更新 更多