2

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

Table_A 将有 4 列:

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

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

  • 第 1 列名为“sandwich_category”,对应于 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 行,在这种情况下,我想让代码自动从最近输入的三明治中提取图像从表_A。换句话说,在 Table_B 中尚未设置 features_sandwich_id 的情况下,我希望 select 语句自动从 Table_A 中提取最近发布的三明治的 ID 和图像。

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

  • 1 为每种三明治类别自动创建的 div。
  • 2:Div 包含Table_B 的sandwich_category 名称,并检查Table_B 中是否设置了featured_sandwich_id。
  • 3:如果已经设置了featured_sandwich_id,则拉取Table_A中三明治id关联的图片。
  • 4:如果未设置featured_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>';

    }

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

关于如何做到这一点的任何想法?

4

1 回答 1

0

尝试LEFT JOINORDER BY并且DESC

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_A's将这两个表链接sandwich_typeTable_B's sandwich_category,对吗?但是Table_B's的内容sandwich_category是字符串。所以这意味着Table A'ssandwich_type是一个字符串?

为什么不直接用Table_B's链接它们primary 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
于 2015-11-25T00:59:02.233 回答