【问题标题】:Need a mysql case statement that checks a cell需要一个检查单元格的 mysql case 语句
【发布时间】:2015-11-24 21:36:42
【问题描述】:

我目前有 2 张桌子,假设 Table_A 包含数百个三明治以及有关它们和图片的信息,而 Table_B 包含特定的三明治组。例如:

Table_A 将有 4 列:

  • 自动递增的第 1 列“id”
  • 第 2 列“sandwich_name”,其中包含肉丸三明治 1、肉丸三明治 2、肉丸三明治 3、火鸡三明治 1 等
  • 第 3 列“三明治类型”,在这种情况下为肉丸三明治、肉丸三明治、肉丸三明治、火鸡三明治
  • 第 4 列“sandwich_picture”列,其中包含指向图片的链接。

Table_B 将有助于对三明治进行分类:

  • 名为“sandwich_category”的第 1 列与 Table_A 中的第 3 列对应,包含标题“肉丸三明治”、“土耳其三明治”
  • 第 2 列“featured_sandwich_id”,我可以从 Table_A 中选择三明治的 ID,我有一个 SELECT 语句来提取其特色图像:

    SELECT featured_sandwich_id FROM Table_B WHERE sandwich_category='Meatball Sandwich' AND featured_sandwich_id != 0
    

然后我有一个 if/while 代码来加载特色三明治图像。

我遇到的问题是,在某些情况下,Table_A 中会有一个新的 sandwich_type,它在 Table_B 中还没有自己的 sandwich_category 行,在这种情况下,我希望代码自动从最最近从 Table_A 输入的三明治。换句话说,如果尚未在 Table_B 中设置 features_sandwich_id,我希望 select 语句自动从 Table_A 中提取最近发布的三明治的 ID 和图像。

我会尝试更具体,并写出我希望代码通过的过程:

  • 1 为每种三明治类别自动创建的 div。
  • 2:Div 包含 Table_B 的 Sandwich_category 名称,并检查 Table_B 中是否设置了 features_sandwich_id。
  • 3:如果已设置 features_sandwich_id,则拉取 Table_A 中与三明治 id 关联的图像。
  • 4:如果未设置 features_sandwich_id(或者由于某种原因尚未在 Table_B 中详细说明 Sandwich_category),请使用来自所述 sandwich_category 的最新三明治的 Sandwich_category 名称和图像,并将它们填充到上面的 div 中.

这是我当前的代码:

    $QUERY = "(
    SELECT Table_A.sandwich_picture, Table_A.sandwich_type, Table_B.featured_sandwich_id 
    FROM Table_A 
    LEFT JOIN Table_B 
    ON (Table_A.id = Table_B.featured_sandwich_id) 
    WHERE (Table_A.sandwich_type = 'Meatball Sandwich') 
    LIMIT 1)"

上述 LEFT JOIN 包含“肉丸三明治”和所有其他三明治类型的图像,但绝不是关联的特征三明治 ID 的图像。

将上面的语句切换为 RIGHT JOIN 始终具有 'Meatball Sandwich' 的 features_sandwich_id 和任何其他 Sandwich_type 的图像,但如果未在表中设置 features_sandwich_id,它会拉出 0 个结果。

这里以 PHP 的其余部分为例:

    ... while($query_results){

    echo '<div class="sandwich_category">
    <img src="$query_results['sandwich_picture']">
    <br>
    <p class="sandwich_category_name">';
    echo $query_results['sandwich_category']; // This is the category name
    echo '</p>
    </div>';

    }

据我了解,为了节省资源,最好将其压缩为单个语句,但是我无法确定正确的联接类型。

你知道如何做到这一点吗?

【问题讨论】:

  • 在我看来,如果要查询最近添加的 ID,则需要在 Table_A 中添加 date_added DATETIME 列。
  • 感谢您的回复 - 这可能会有所帮助,但主要问题是如何组合表格,如果没有设置 features_sandwich_id 以从中提取图像,则从中提取图像最近输入的与 Sandwich_category 匹配的三明治 ID。

标签: php mysql join inner-join right-join


【解决方案1】:

试试LEFT JOINORDER BYDESC

SELECT b.sandwich_category, b.featured_sandwich_id, a.id, a.sandwich_name, a.sandwich_type, a.sandwich_picture
FROM Table_B b
LEFT JOIN Table_A a ON b.sandwich_category = a.sandwich_type
WHERE b.sandwich_category = 'Meatball Sandwich'
      AND b.featured_sandwich_id != 0 ORDER BY a.id DESC

我只想澄清的是,您想通过Table_Asandwich_type 将这两个表链接到Table_Bsandwich_category,对吗?但是Table_Bsandwich_category 的内容是字符串。那么这意味着Table Asandwich_type 是一个字符串?

为什么不直接通过Table_Bprimary id 链接它们?它会更快更可靠。

更新:

SELECT b.sandwich_category, b.featured_sandwich_id, a.id, a.sandwich_name, a.sandwich_type, a.sandwich_picture
FROM Table_B b
LEFT JOIN Table_A a ON b.featured_sandwich_id = a.id
                    AND b.sandwich_category = a.sandwich_type
WHERE b.sandwich_category = 'Meatball Sandwich' AND b.featured_sandwich_id != 0 ORDER BY a.id DESC

【讨论】:

  • 我将尝试更具体并写出我希望代码通过的过程: 1:为每种三明治类别自动创建 div。 2:Div 将包含sandwich_category 名称和已在Table_B 中设置的featured_sandwich_id 的图像,并从Table_A 中匹配的三明治ID 中提取图像数据。 3:如果 Table_B 中没有设置 features_sandwich_id 或尚未在 Table_B 中创建三明治类别,则使用该三明治类别中的三明治类别和最近发布的三明治图像。抱歉有点混乱,希望对您有所帮助。
  • 我已经更新了主帖,格式更简单,解释更好:-)
  • @Chris - Table Bfeatured_sandwich_id 包含什么?来自Table A 的任何id?或者只是一个10 用于触发目的?
  • @Chris 我认为您的代码有问题,因为您的表结构。也许你应该重做你的表结构和架构。
  • 表 B 的 features_sandwich_id 将包含表 A 中的任何 id,表 A 的 ID 对应于特定的三明治。我现在遇到的问题是,如果我在表 A.id 上 RIGHT JOIN 表 B.featured_sandwich_id,它将拉出 features_sandwich_id 的图像并按预期显示,但任何没有特定 features_sandwich_id 集的 Sandwich_category 都不会显示在结果中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多