MySQL:从表中选择要在另一个表的字段中指定的名称

时间:2012-03-28 20:49:07

标签: php mysql sql

我有一个feed表,其中包含以下字段:

  • id - 唯一Feed标识
  • created - 创建Feed的日期
  • table - 其余Feed信息所在的表格的名称

然后我说了2个表:feed_imagefeed_text。现在这两个表包含有关Feed,不同字段的不同信息。

如何(在MySQL中)从feed.table中指定名称的相应表格中提取Feed的信息?

以下是我的架构的样子:

                                                 +------------------+
                                                 |    table_a       |
      +---------------------+                    |------------------|
      |   feed              |                    | id               |
      |---------------------|             +------+ feed_id          |
      |  id         <-------------------+-+      | field_in_a       |
      |  created            |           |        | ...              |
      |  table              |           |        |                  |
      |                     |           |        |                  |
      |                     |           |        |                  |
      |                     |           |        +------------------+
      +---------------------+           |
                                        |
                                        |
                                        |        +-------------------+
                                        |        |   table_b         |
                                        |        |-------------------|
                                        |        |  id               |
                                        +--------+  feed_id          |
                                                 |  field_in_b       |
                                                 |  ...              |
                                                 |                   |
                                                 |                   |
                                                 |                   |
                                                 |                   |
                                                 +-------------------+

每个Feed都存在于table_a或table_b或table_c或...中(我有30个)。 如何指定从哪个表中提取信息(每个表具有不同的结构)。

或者,如果我在每个table_*.feed_id上添加索引并将其映射到feed.id,那么InnoDB会做一些魔术,所以当我加入它们时,它只会看到其中一个,而不是所有30个?

我的最新想法是只有一个表feed和一个字段feed.content,我将存储一个不同PHP类的序列化PHP对象,表示不同的Feed类型及其各自的内容。

关于表现的最佳方式是什么?

P.S。:单个参数不需要选择/搜索/排序记录,只需created。这个想法应该能够与1 000 000+记录很好地配合。

更新:

澄清30+ table_a / b / c ..

每个Feed可能有太多不同的类型(新的也会随时间添加):

  • 图片Feed会包含VARCHAR(255)url字段
  • 文字Feed会有LONGTEXT text字段
  • youtube.com Feed会有VARCHAR(255)title,VARCHAR(255)video_id字段
  • A * .com Feed会有* x1,* x2,* x3 ...字段

然后将根据类型使用PHP显示每个Feed:

  • 图像将显示为来自给定网址的图像
  • 文本将显示为纯文本
  • youtube.com Feed会显示一个视频播放器,其中包含来自给定视频ID的给定标题
  • A * .com Feed会显示......:)

3 个答案:

答案 0 :(得分:3)

我会使用LEFT JOIN并在select中为我的列添加别名,并在联接中为我的表添加别名,以便您返回所需的所有信息。

无论使用何种语言,您可以根据需要对结果进行分组并执行逻辑。

更新:

为什么你有30张桌子?也许有一个“meta”表,其中包含来自等的Feed创建日期url ...以及另一个包含唯一记录ID,Feed id,内容,内容类型的表。

通过这种方式,您可以加入一个表格,其中Feed ID匹配,也可以按内容类型分组或过滤。

可视化:Feed表

--------------------------------------------------------------
|  feed_id   | feed_name  |  feed_created     |   Feed_url   |
--------------------------------------------------------------
|     1      | Feed 1     |  03/28/2012       |  www.go.com  |
--------------------------------------------------------------
|     2      | Feed 1     |  03/28/2012       |  www.be.com  |
--------------------------------------------------------------
|     3      | Feed 2     |  03/28/2012       |  www.hi.com  |
--------------------------------------------------------------
|     4      | Feed 3     |  03/28/2012       |  www.ex.com  |
--------------------------------------------------------------

可视化:Feed资源表

------------------------------------------------------------------------------------------------
|   rec_id   |  feed_id   |     content                                         |    type      |
------------------------------------------------------------------------------------------------
|     1      |      1     | 'hello world!                                       |    text      |
--------------------------------------------------------------------------------------
|     2      |      3     | 'http://me.com/my-image                             |     img      |
------------------------------------------------------------------------------------------------
|     3      |      2     |{\'title\':\'VIDEO\',\'url\':\'http://me.com/1.mov\'}|     vid      |
------------------------------------------------------------------------------------------------
|     4      |      1     | 'Wow that was easy!'                                |     text     |
------------------------------------------------------------------------------------------------

答案 1 :(得分:2)

你不能做这样的事情:

                                                     +------------------+
                                                     |    table_a       |
          +---------------------+                    |------------------|
          |   feed              |                    | id               |
          |---------------------|             +------+ feed_id          |
          |  id         <-------------------+-+      | field_in_a       |
          |  created            |           |        | ...              |
          |                     |           |        |                  |
          |                     |           |        |                  |
          |                     |           |        |                  |
          |                     |           |        +------------------+
          +---------------------+           |
                                            |
                                            |
                                            |        +-------------------+
                                            |        |   table_b         |
                                            |        |-------------------|
                                            |        |  id               |
                                            +--------+  feed_id          |
                                                     |  field_in_b       |
                                                     |  ...              |
                                                     |                   |
                                                     |                   |
                                                     |                   |
                                                     |                   |
                                                     +-------------------+

然后加入table_atable_b的记录? MySQL非常高效。

答案 2 :(得分:1)

您应该创建一个标准化的布局,如d_inevitable建议的那样。

您还没有告诉我们您是如何显示这些数据的。但是您可以使用select * from feed获取所有Feed的列表;

然后,您可以通过搜索其他表格获取Feed的其他数据。对于您的网址示例,如果table_a = URL和field_in_a =网址

无论您使用哪种Feed,都会搜索包含该Feed的ID的网址。 从feed_id =“id”的网址中选择* 这将允许每个Feed具有与其关联的1到多个URL。 您可以为与Feed关联的每种数据类型执行此操作。 “feed_id”是您用来引用它的外键的外键。

关键是要归结为你如何展示它。 你需要遍历所有的Feeds,然后适当地构建一个表(?)。

如果Feed有两个网址,您希望它看起来怎么样?

是否应显示

-------------------------------------------------
| Feed Name  |  Feed Created     |   URL        |
-------------------------------------------------
| Feed 1     |  03/28/2012       |   www.go.com |
-------------------------------------------------
| Feed 1     |  03/28/2012       |   www.be.com |
-------------------------------------------------
| Feed 2     |  03/28/2012       |   www.hi.com |
-------------------------------------------------
| Feed 3     |  03/28/2012       |              |
-------------------------------------------------

-------------------------------------------------
| Feed Name  |  Feed Created     |   URL        |
-------------------------------------------------
| Feed 1     |  03/28/2012       |   www.go.com |
|            |                   |   www.be.com |
-------------------------------------------------
| Feed 2     |  03/28/2012       |   www.hi.com |
-------------------------------------------------
| Feed 3     |  03/28/2012       |              |
-------------------------------------------------

我认为数据布局应该是d_inevitable建议的,然后你需要确定如何显示数据,这将决定你如何查询它。