【问题标题】:Can I do this with just SQL?我可以只用 SQL 做到这一点吗?
【发布时间】:2011-01-30 12:42:00
【问题描述】:

目前我有两张桌子,productsoptions

产品包含

  1. 身份证
  2. 标题
  3. 说明

选项包含

  1. 身份证
  2. product_id
  3. sku
  4. 标题

样本数据可能是:

Products
编号:1
标题:'测试'
描述:'我的描述'

Options
编号:1
产品编号:1
货号:1001
标题:'红色'

id:2
产品编号:1
货号:1002
标题:'蓝色'

我需要显示每个项目,每个不同的选项。目前,我选择products 中的行并遍历它们,并为每一行从options 中选择适当的行。然后我创建一个数组,类似于:

[product_title] = 'test';  
[description]   = 'my description';  
[options][]     = 1, 1001, 'red';  
[options][]     = 2, 1002, 'blue';

仅使用 sql 是否有更好的方法(我正在使用 codeigniter,理想情况下希望使用 Active Record 类)?

【问题讨论】:

  • 那么,您更喜欢原始 SQL 还是 Codeigniter ORM 的答案?
  • 两者都可以,原始 SQL 意味着我了解实际发生的情况,CI 保持代码干净!

标签: php sql mysql codeigniter


【解决方案1】:

开始

SELECT * FROM products INNER JOIN options ON product.id = options.product_id

然后从那里开始工作。

该示例仅适用于至少有一个可用选项的产品(这是您的设计所要求的,否则您将无法放置 SKU)。但如果有些产品根本没有任何选择,你想要:

SELECT * FROM products LEFT JOIN options ON product.id = options.product_id

最后,列出您想要返回的实际列而不是 SELECT * 是一种很好的做法。

【讨论】:

  • 谢谢。但是,有没有办法将它作为某种 2d 表进行检索,其中我有产品,以及包含选项表的“列”?
  • @Josh。不是在标准 SQL 中,据我所知(这是 not 确定的)在 MySQL 中。一些 DBMS 允许多个和嵌套的结果集,但它非常不标准。此外,假设您正确声明了 DM 和 ORM 中的关系,ORM 可能会支持这一点——然后您将通过表示产品记录的对象的集合属性访问选项记录。
  • 啊,那我去看看。感谢您的精彩回答!
【解决方案2】:

您需要加入产品和选项。试试这个查询:

select *
from products, options
where products.id = options.product_id

【讨论】:

    【解决方案3】:

    select * from Products a,option b where a.id = b.product_id;

    你可以使用

    select * from option where product_id = (select id from Products)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多