简体   繁体   English

我不知道如何编写一个sql查询以显示所需的信息

[英]I cant figure out how to write an sql query to display the information how I want

I've gotten my database set up for my website and I'm a little baffled on how I should write the SQL query to display the information how I want it. 我已经为我的网站设置了数据库,但我对如何编写SQL查询以显示所需信息的方式有些困惑。

Here's an image of how my database is setup and an example of how I want to display it: 这是有关如何设置数据库的图像,以及有关如何显示数据库的示例:

Here's the SQL query I wrote to get the information (Im open to writing a better solution) 这是我为获取信息而编写的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

This gets me all the info but I'm not sure how to write the output to get it to show how i want. 这可以获取所有信息,但是我不确定如何编写输出以显示我想要的信息。

One solution is to order by category: 一种解决方案是按类别订购:

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

With that, you can loop in PHP, and output a new header whenever a new category appears. 这样,您就可以循环使用PHP,并在出现新类别时输出新的标头。 Something like this: 像这样:

<?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'];
}
?>

You should probably use nested html lists instead of the markup above, but this should get you started. 您可能应该使用嵌套的html列表而不是上面的标记,但这应该可以帮助您入门。

Since you use PHP, the best way to do this is to use an outer-inner-query loop: 由于您使用的是PHP,因此最好的方法是使用外部内部查询循环:

Outer query: SELECT * FROM drings_category , then loop: 外部查询: SELECT * FROM drings_category ,然后循环:

  • Display drink_category_title 显示Drink_category_title
  • Use drink_category_id as $ID for 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 使用Drink_category_id作为$ 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
  • Loop and display drinks 循环显示饮料

Hideously over complicated way to do it in a single sql statement for 3 fixed columns, coping with up to 1000 drinks in each category. 在3个固定列的单个sql语句中执行此操作的方法复杂得令人难以置信,每个类别最多可处理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

Not tested. 未经测试。 Better to do the formatting in php, but was bored 最好在php中进行格式化,但很无聊

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM