【问题标题】:Another mysql JOIN question另一个mysql JOIN问题
【发布时间】:2010-02-05 18:13:46
【问题描述】:

我有这些表:

classified:
classified_id (PK)
price
headline
cat_id // THIS IS ANYTHING FROM 1 TO 30 DEPENDING ON CATEGORY. IT IS SO THAT I CAN LINK WHICH CATEGORY TO USE IN THE CATEGORY TABLE BELOW
text
etc...

category:
cat_id (PK)
cat_name

category_options:
option_id (PK)
cat_id (FK) // FOREIGN KEY FROM CATEGORY TABLE...
option_name

option_values:
value_id (PK)
option_id (FK)
classified_id (FK)
value

我应该如何在这里使用 join,谁能给我一个简单的例子?

这是我的设置示例:

      category
cat_id       cat_name
  1            cars

         category_options
option_id     cat_id    option_name 
   1             1         color
   2             1        gearbox

         option_values
 value_id       option_id       classified_id      value
    1              1                 22             red
    2              2                 22            manual

         classified
classified_id      price        headline         cat_id
    22              5000        'test'              1 //for cars

我希望能够通过仅“知道”分类 ID(在本例中为 22)从一个类别(在此前车中)检索所有选项及其值。

基本上,我需要关于 join 语句的帮助...

请不要在代码中使用别名为我简化它:)

谢谢

【问题讨论】:

  • 每个选项可以有多个值吗?您要根据cat_idclassified_id 还是两者来选择它们?
  • 不,每个类别有多个选项,但每个选项名称只有一个值...我想根据分类 ID 和 cat_id 选择它们,所以假设 cat_id = 1 和分类 ID = 22
  • 那么 imo 没有真正的理由拥有 value_id,因为 option_idclassified_id 都会作为选项值的主键..

标签: php sql mysql database


【解决方案1】:

我知道这并不能回答您的主要问题,但我想提出一个我相信会让您的生活更轻松的建议...

  1. PK 列的列名——只需将它们都称为“id”。减少你必须记住的事情的数量。消除了混乱和潜在错误的主要来源。

  2. 使表名一致。我的意思是使它们都具有相同的形式。您可以将它们全部设为单数名词或全部设为复数名词,但只需将它们全部设为相同即可。查询变得更容易编写和理解。

    classifieds

    categories

    category_options

    option_values

  3. FK cols 的列名——像这样:parent_table_id。例如:classified.category_id

  4. 消除任何不包含新信息的措辞。例如,category.name 而不是 category.cat_name

【讨论】:

  • re (1):我不同意。尤其是在处理连接时,很多 更容易为 id 列设置唯一名称,因此您可以轻松查看哪些 id 应该被解释为相同的。我同意(4),因为它们不会创建索引,但对于索引列,最好使用唯一的名称,分布在所有表示相同 id 的表中。
【解决方案2】:

实际上,您甚至不需要在此处明确指定联接。您想从 option_id 相同的两个表(选项及其值)中获取值,并仅选择您的 cat 和分类 id 匹配的结果,这同样简单。

SELECT cat_id, classified_id, option_id, option_name, value
  FROM option_values, category_options
 WHERE category_options.option_id = option_values.option_id
   AND classified_id = <?> AND cat_id = <?>

【讨论】:

  • 嗨...这很好用,谢谢...但是如果我想插入广告怎么办。我知道如何插入分类表,但我不知道如何插入 option_values 的值,因为需要插入的行不止一行。分类表很简单,因为它只有一行,但 option_values 表的每个分类 ID 有多行。你也可以为我做一个插入语句吗?谢谢
  • 对于插入,只需多次执行相同的插入语句(当然会改变值)。或者您可以使用该语法一次添加多个值 (INSERT INTO tbl ( col1, col2, col3 ) VALUES ( row1-1, row1-2, row1-3 ), ( row2-1, row2-2, row2-3), ...),但大多数时候这并不是处理动态内容时最简单的方法(当您知道将插入多少行时,使用该语法很容易,但是对于动态数字,只需在每个语句中插入一行)。
【解决方案3】:

类似

SELECT category_option.option_name, option_values.value FROM classified, category_option, option_values WHERE classified.classified_id=?id AND classified.cat_id=category_options.cat_id AND option_values.option_id=category_options.option_id

如果您为 ?id 参数传入 22,您将获得 2 行:

红色

变速箱手册

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-09
    • 2019-12-09
    • 1970-01-01
    • 2012-03-15
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多