【问题标题】:I cant figure out how to write an sql query to display the information how I want我不知道如何编写一个 sql 查询来显示我想要的信息
【发布时间】:2013-05-21 03:08:48
【问题描述】:

我已经为我的网站设置了数据库,但我对如何编写 SQL 查询来显示我想要的信息感到有些困惑。

这是我的数据库如何设置的图像以及我希望如何显示它的示例:

这是我为获取信息而编写的 SQL 查询(我愿意编写更好的解决方案)

SELECT * FROM drinks_category, drinks_lookup, drinks
WHERE drinks.drink_id = drinks_lookup.drink_id
AND drinks_lookup.drinks_category_id = drinks_category.drinks_category_id

这为我提供了所有信息,但我不确定如何编写输出以显示我想要的方式。

【问题讨论】:

  • 这是学校作业吗?这是一个基本的数据库查询
  • 一种饮料可以属于多个类别吗?您发布的数据中不会发生这种情况,但您要允许吗?
  • 您需要将其作为纯 SQL 解决方案,还是仅返回每种饮料及其所属类别,然后使用 php 对其进行格式化以输出?
  • 另外,你写过查询吗?看起来您只需要两个连接,按类别排序。
  • 是的 Karthikr,请原谅我的无知,我对此还很陌生。

标签: php mysql sql database


【解决方案1】:

一种解决方案是按类别排序:

SELECT * 
FROM drinks_category, drinks_lookup, drinks 
WHERE drinks.drink_id = drinks_lookup.drink_id 
AND drinks_lookup.drinks_category_id = drinks_category.drinks_category_id
ORDER BY drinks_category.drink_category_title

这样,您可以在 PHP 中循环,并在出现新类别时输出新标题。像这样的:

<?php
$last_category = 0;
foreach($data as $row) {
    if($row['drinks_category_id'] != $last_category) {
        echo '<h1>' . $row['drink_category_title'] . '</h1>';
    }
    echo '<div>' . $row['drinks_name'] . '</div>';
    $last_category = $row['drinks_category_id'];
}
?>

您可能应该使用嵌套的 html 列表而不是上面的标记,但这应该可以帮助您入门。

【讨论】:

  • 这正是我想要的,感谢您的帮助!
  • 快速提问,我一直在想办法把它放到一个列表中,但无法让它工作......你能帮我把它作为一个列表工作吗?我的主要问题是试图让
      在那里..
  • 我想要一个嵌套列表,它可能有点棘手,可能值得单独提问。不管是否嵌套,最外层的 ul 都在循环之外。
  • 只是想告诉你我在stackoverflow.com/q/16755108/1837281 得到的一些答案的最新情况,以防你感兴趣。
  • 感谢@AlbertFajardo 的反馈。但是,您在该问题中要求的是 3 个单独的列表(我认为您可能希望这 3 个列表作为外部列表的列表项)。无论如何,我很高兴你得到了答案!
【解决方案2】:

由于您使用 PHP,因此最好的方法是使用外部-内部-查询循环:

外部查询:SELECT * FROM drings_category,然后循环:

  • 显示drink_category_title
  • 使用drink_category_id 作为SELECT drinks.drink_name FROM drinks INNER JOIN drinks_lookup ON drinks.drink_id=drinks_lookup.drink_id WHERE drinks_lookup.drink_category_id=$ID 的$ID
  • 循环展示饮料

【讨论】:

    【解决方案3】:

    在单个 sql 语句中为 3 个固定列执行此操作的方法极其复杂,每个类别最多可处理 1000 种饮料。

    SELECT DrinkCategory1Subselect.drink_name AS 'Drink Category Title', DrinkCategory2Subselect.drink_name AS 'Drink Category Title 2', DrinkCategory3Subselect.drink_name AS 'Drink Category Title 3'
    FROM (SELECT a.i+b.i*10+c.1*100 AS aCounter
    FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a,
    (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b,
    (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c) Deriv1
    INNER JOIN (SELECT  c.drink_name, 
        @Counter := @Counter + 1 AS aCounter
    FROM drinks_category a
    INNER JOIN drinks_lookup b ON a.drink_category_id = b.drink_category_id
    INNER JOIN drinks c ON b.drink_id = c.drink_id
    CROSS JOIN (SELECT @Counter:=0) NothingUseful
    WHERE a.drink_category_id = 1
    ORDER BY c.drink_id) DrinkCategory1Subselect
    ON DrinkCategory1Subselect.aCounter = Deriv1.aCounter
    INNER JOIN (SELECT  c.drink_name, 
        @Counter := @Counter + 1 AS aCounter
    FROM drinks_category a
    INNER JOIN drinks_lookup b ON a.drink_category_id = b.drink_category_id
    INNER JOIN drinks c ON b.drink_id = c.drink_id
    CROSS JOIN (SELECT @Counter:=0) NothingUseful
    WHERE a.drink_category_id = 2
    ORDER BY c.drink_id) DrinkCategory2Subselect
    ON DrinkCategory2Subselect.aCounter = Deriv1.aCounter
    INNER JOIN (SELECT  c.drink_name, 
        @Counter := @Counter + 1 AS aCounter
    FROM drinks_category a
    INNER JOIN drinks_lookup b ON a.drink_category_id = b.drink_category_id
    INNER JOIN drinks c ON b.drink_id = c.drink_id
    CROSS JOIN (SELECT @Counter:=0) NothingUseful
    WHERE a.drink_category_id = 3
    ORDER BY c.drink_id) DrinkCategory3Subselect
    ON DrinkCategory3Subselect.aCounter = Deriv1.aCounter
    WHERE DrinkCategory1Subselect.drink_name IS NOT NULL
    OR DrinkCategory2Subselect.drink_name IS NOT NULL
    OR DrinkCategory3Subselect.drink_name IS NOT NULL
    ORDER BY Deriv1.aCounter
    

    未测试。最好在php中进行格式化,但是很无聊

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      相关资源
      最近更新 更多