从表中打印出某些行

时间:2015-07-08 09:21:04

标签: mysql sql

我可以在数据库中随时更改或删除使用的名称,因为现在我必须更改脚本中的每个名称。我可以用IF打印出来吗?

<?php

    $sql = "SELECT detail, 
                SUM(IF(depot = 'Huvuddepån', quantity, 0)) AS Huvuddepån,
                SUM(IF(depot = 'Uddevalla', quantity, 0)) AS Uddevalla,
                SUM(IF(depot = 'Jönköping', quantity, 0)) AS Jönköping,
                SUM(IF(depot = 'Polyeten', quantity, 0)) AS Polyeten,
                SUM(IF(depot = 'Krackern', quantity, 0)) AS Krackern
            FROM quantities 
            GROUP BY detail";
    $result = $conn->query($sql);

    echo "<table border='0' cellspacing='3' cellpadding='3'>";
    echo "<tr>";
    echo "<td width='300'>"."<b>Detalj</b>"."</td>";
    echo "<td align='center' width='100'>"."<b>Huvuddepån</b>"."</td>";
    echo "<td align='center' width='100'>"."<b>Uddevalla</b>"."</td>";
    echo "<td align='center' width='100'>"."<b>Jönköping</b>"."</td>";
    echo "<td align='center' width='100'>"."<b>Polyeten</b>"."</td>";
    echo "<td align='center' width='100'>"."<b>Krackern</b>"."</td>";

    echo "</tr>";

    if ($result->num_rows > 0) {
        // output data of each row
        while($row = $result->fetch_assoc())
        {
            echo "<tr>";
            echo "<td>".$row["detail"]."</td>";
            echo "<td align='center'>".$row["Huvuddepån"]."</td>";
            echo "<td align='center'>".$row["Uddevalla"]."</td>";
            echo "<td align='center'>".$row["Jönköping"]."</td>";
            echo "<td align='center'>".$row["Polyeten"]."</td>";
            echo "<td align='center'>".$row["Krackern"]."</td>";
            echo "</tr>";

        }
    } else {
        echo "0 results";
    }

    echo "</table>";
?>

1 个答案:

答案 0 :(得分:0)

这个怎么样?见sqlfiddle

SET @COLUMNS = NULL;

SELECT GROUP_CONCAT(
        DISTINCT CONCAT(
                'SUM(CASE WHEN depot = "',
                depot,
                '" THEN quantity ELSE 0 END) AS "',
                depot,
                '"'
        )
) INTO @COLUMNS
FROM quantities;

SET @SQL = CONCAT(
        'SELECT  
                detail,
                ',@COLUMNS,'
        FROM
                quantities
        GROUP BY
                detail'
);

PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

它适用于下表:

CREATE TABLE quantities(
  detail INT,
  depot VARCHAR(20),
  quantity INT
);

INSERT INTO quantities VALUES (1,"Huvuddepån",10);
INSERT INTO quantities VALUES (2,'Uddevalla',15);
INSERT INTO quantities VALUES (2,'Jönköping',20);
INSERT INTO quantities VALUES (3,'Polyeten',10);
INSERT INTO quantities VALUES (1,'Krackern',10);
INSERT INTO quantities VALUES (4,"fo'o6",10);

注意:但是,如果您的depot之一包含引号",则很可能会中断。如果您的数据可能包含此类引号,则应考虑使用REPLACE\"替换为"以逃避它们。

你应该使用的PHP代码如下,我在sql中逃过了 <?php $sql = "SET @COLUMNS = NULL; SELECT GROUP_CONCAT( DISTINCT CONCAT( 'SUM(CASE WHEN depot = \"', depot, '\" THEN quantity ELSE 0 END) AS \"', depot, '\"' ) ) INTO @COLUMNS FROM quantities; SET @SQL = CONCAT( 'SELECT detail, ',@COLUMNS,' FROM quantities GROUP BY detail' ); PREPARE stmt FROM @SQL; EXECUTE stmt; DEALLOCATE PREPARE stmt;"; $result = $conn->query($sql); echo "<table border='0' cellspacing='3' cellpadding='3'>"; echo "<tr>"; echo "<td width='300'>"."<b>Detalj</b>"."</td>"; echo "<td align='center' width='100'>"."<b>Huvuddepån</b>"."</td>"; echo "<td align='center' width='100'>"."<b>Uddevalla</b>"."</td>"; echo "<td align='center' width='100'>"."<b>Jönköping</b>"."</td>"; echo "<td align='center' width='100'>"."<b>Polyeten</b>"."</td>"; echo "<td align='center' width='100'>"."<b>Krackern</b>"."</td>"; echo "</tr>"; if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "<tr>"; echo "<td>".$row["detail"]."</td>"; echo "<td align='center'>".$row["Huvuddepån"]."</td>"; echo "<td align='center'>".$row["Uddevalla"]."</td>"; echo "<td align='center'>".$row["Jönköping"]."</td>"; echo "<td align='center'>".$row["Polyeten"]."</td>"; echo "<td align='center'>".$row["Krackern"]."</td>"; echo "</tr>"; } } else { echo "0 results"; } echo "</table>"; ?> ,因为它们不是,我相信问题来自这里:

foreach (var item in multiplayers)
{
     if (item == null) { Console.WriteLine("Empty"); }
     Console.WriteLine(item);
}