【问题标题】:PHP MySQL Column Loop if name is similar?如果名称相似,则 PHP MySQL 列循环?
【发布时间】:2023-03-18 23:02:02
【问题描述】:

我不确定这是否存在于 PHP/MySQL 中,

我想在 mysql 数据库中动态返回多个具有相似名称的列,并且它们为 null/"" 然后不返回该行,因为您不能添加重复的列名,我不确定如何做到这一点?

我正在这样做,但正在寻找一种更动态的方式,因为我不想依赖使用数组,通过传递一个让我们说“名称”的字符串,这可能吗?有点像 MySQL select "SELECT * FROM db WHERE name = 'Jack';"

$names = array("name1", "name2", "name3", "name4");

foreach ($names as $value) {

            if($row [$value] > 0){
                //
            }else{
                if($row [$value] == null){
                    //
                }else{
                    echo $row[$value];
                }
            }
        }

这是数据库的结构 - 假设下面的“”是空白的;

id category subcat name1 name2 name3 name4 name5
1  people   names  jack  bob   sue   anna  ""
2  people   names  name  name  ""    ""    ""
3  animals  ...    ..    .     .. etc 

这是我的 php mysql 查询;

$sql = "SELECT * FROM db WHERE category = 'people'"; 
    $result = $conn->query($sql);

    $names = array("name1", "name2", "name3", "name4","name5");

        while($row = $result->fetch_assoc()) {

            echo $row["subcat"]."<br>";

            foreach ($names as $value) {
                if($row [$value] > 0){
                    //
                }else{
                    if($row [$value] == null){
                        //
                    }else{
                        echo $row[$value]."<br>";
                    }
                }
            }
        }

【问题讨论】:

  • 行、列、值?你确定你了解它们在mysql中的区别吗?
  • 请显示您的数据库架构、示例数据以及您要返回的内容。您的描述非常不清楚。
  • 拥有name1name2 等列通常是一种糟糕的表格设计。你应该有一个关系表,每个名字都有一行,然后你可以使用JOIN
  • @Lashane & Barmar 谢谢.. 我已经用数据库模式和查询更新了我的问题,我不想有多个表。想把它们都放在一张桌子上,还是不可能做到这一点?
  • @Barmar 如果让我们说列名 name1/name2/name3...随着时间的推移动态更新... name6/name7/name8 等...

标签: php mysql loops foreach


【解决方案1】:

最好的方法是使用单独的names 表:

item_id name
1       jack
1       bob
1       sue
1       anna
2       name1
2       name2

然后你可以将它与原始表连接起来:

SELECT d.id, d.category, d.subcat, n.name
FROM db AS d
JOIN names AS n ON n.item_id = d.id
WHERE d.category = 'people'
ORDER BY d.id

使用您现有的结构,您可以在 PHP 中执行此操作:

while ($row = $result->fetch_assoc()) {
    echo $row['subcat'] . "<br>";
    foreach ($row as $col => $value) {
        if (substr($col, 0, 4) == 'name' && $value != '') {
            echo $value . "<br>";
        }
    }
}

【讨论】:

  • 非常感谢,不幸的是我不能使用另一个表(正如我所说的)需要全部在我发布的结构中,无论它是否不正确。
  • 哦,好的,刚刚看到您的消息的最后一部分,抱歉.. 刚刚尝试它不起作用? - 将尝试调试它,但这正是我想要的......感谢@Barmar,这非常有帮助!
【解决方案2】:

您想从不同的列中获取多行,并且行具有相似的值。但是一个值不能出现两次?并且不能为空?

您可以使用DISTINCT 语句来检查值是否不为空,您可以在WHERE 语句> IS NOT NULL 之后使用。所以整个 sql 语句看起来像下面的例子。

SELECT DISTINCT column_name,column_name FROM table WHERE YourColumn IS NOT NULL;

【讨论】:

  • 感谢您的回答,但这不是我想做的。我想动态循环选择与 KEY 而不是 VALUE 具有相同关键字的列,请查看我更新的问题@nejc-rodošek
【解决方案3】:

不妨试试这个:

$sql = "SELECT * FROM db WHERE category = 'people'"; 
$result = $conn->query($sql);

$names = array("name1", "name2", "name3", "name4","name5");

    while($row = $result->fetch_assoc()) {

        echo $row["subcat"]."<br>";

        foreach ($names as $value) {
            if(in_array($value, $names)){
                // the value is in the names array
                echo $row[$value]."<br>";
                ...
            }else{
                // the value is not in the names array
                ...
            }
        }
    }

【讨论】:

  • 我的问题中的代码有效。我不想使用数组!我想要一种更动态的方式来做到这一点。
  • @whitedeath 不幸的是,$names 是一个数组。
  • 是的,但我不想使用它,看看我接受的答案,这正是我需要它的功能。感谢您的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多