【问题标题】:MYSQL select display matching and non matching recordsMYSQL 选择显示匹配和不匹配的记录
【发布时间】:2019-09-06 21:25:35
【问题描述】:

我有一个由新行分隔的字符串列表。我需要将这些字符串与一个表中的列中的值进行匹配。问题是我需要将不匹配的记录显示为定义的值,例如“未找到”,因此输出保持与输入相同的长度,并且结果都保持相同的顺序。

示例输入

  1. 苹果
  2. 橙色
  3. 香蕉

期望的输出

  1. 苹果存在
  2. 找不到橙色
  3. 梨存在
  4. 香蕉存在

是否可以将自定义值分配给未找到的记录以及显示在单个语句中找到的记录? 信息似乎表明我可以使用 IFNULL 创建一个语句来返回不匹配的记录,我已经尝试过这个但没有用。

 <?php
 // Wrap strings for select statement
 $strings = $_POST['mystrings'];
 $regex = '~<[^>]+>(*SKIP)(*FAIL)|\b\w+\b~'; 
 $strings_wrapped = preg_replace($regex, "'\\0',", $strings);
 $strings_prepared = substr($strings_wrapped, 0, -1);

 // Statement
 $select = "select * from table where specific_row in ($strings_prepared)";

 // Connect
 $connect = mysqli_query($con, $select);

      // Retrieve rows
      while ($row=mysqli_fetch_array($connect)) {
      $column1 = $row['column1'];
      $column2 = $row['column2'];
      $column3 = $row['column3'];
      $column4 = $row['column4'];
      $column5 = $row['column5'];

      // Display results
      $results = "$column1-$column2-$column3-$column4-$column5\n";
      echo $results;
      }
 ?>

匹配的行返回没有错误。我只是不知道如何显示不匹配的行。

【问题讨论】:

  • 遍历输入并查看它是否存在于行中。
  • @u_mulder 我得到了很多匹配行的结果,但我还需要显示不匹配的结果。
  • 你有所有的输入吗?遍历它们并检查是否在查询结果中找到它们。
  • @u_mulder 我想我知道你的意思。我会做一个测试然后回来。干杯。

标签: php mysql mysqli


【解决方案1】:

这是您可以使用的方法:

// Statement
$select = "select * from table where specific_row in ($strings_prepared)";
// Connect
$connect = mysqli_query($con, $select);

// Retrieve rows
$founded = [];
while ($row = mysqli_fetch_array($connect)) {
    $founded[$row['specific_row']] = $row['column1'];  // or whatever
}

foreach ($strings_prepared as $string) {
    if (!empty($founded[$string])) {
        echo 'found';
    } else {
        echo 'NOT found';
    }
}

【讨论】:

  • 我用尽了这个例子和多种变体的尝试。它不起作用,因为原始选择语句将结果限制为输入的特定字符串集。解决方案必须在于改变 select 语句。
【解决方案2】:

您可以使用子查询创建包含您要搜索的名称的派生表,并将其与表连接。

SELECT a.value, IF(b.specific_row IS NULL, 'not found', 'exists') AS found
FROM (
    SELECT 'apple' AS value
    UNION
    SELECT 'orange'
    UNION
    SELECT 'pear'
    UNION
    SELECT 'banana'
) AS a
LEFT JOIN table AS b ON a.value = b.specific_row

【讨论】:

  • 我正在为此苦苦挣扎,因为我展示的代码需要一个 where in 子句作为选择的一部分。我不确定如何在您的示例中实现这一点。我可能不应该在主要代码之前包含简单的示例,这是我的错。
  • 将条件放在ON 子句中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多