1

我找不到任何关于将一个 MySQL 表条目动态引用到另一个表条目的信息。这可能是不可能的。

本质上,我想知道在 MySQL 中是否可以将某个 Excel 单元格的值引用到另一个单元格。例如,如果在 Excel 中我将工作表 1 单元格 A1 设置为某个值,例如“MyVal”。然后,如果我将工作表 2 单元格 A1 设置为“=Sheet1!A1”,工作表 3 单元格 A1 设置为“=Sheet2!A1”,则工作表 3 单元格 A1 的值为“MyVal”。如果我回到工作表 1 单元格 A1 并将值更改为“MyNewVal”,那么工作表 2 单元格 A1 和工作表 3 单元格 A1 上的值会自动更新为“MyNewVal”。

我的问题是......在 MySQL 中,我可以将第一个表中某个条目的值设置为动态链接到第二个表中不同条目的值,这样当我查询第一个表时(使用现有的 PHP 代码)我得到第二个表中的值? 我想如果可能的话,那么第一个表中条目的值可能看起来像一个查询,该查询会查询第二个表以获取正确的值。

我了解如何在 PHP 中编写 UPDATE 查询以显式使值相同,但我不想更改现有的 php 代码。我想以相对/动态的方式链接它们。简短的原因是我不想更改 PHP 代码,因为在我维护的几个站点上使用相同的代码,并且我想保持现有的 php 代码相同以便更清洁的维护/升级。

但是,由于各个站点上的数据库已经不同,因此以某种方式动态链接数据库本身不同表中的适当条目将非常干净。

任何帮助将不胜感激。如果这是可能的,如果你能指出我正确的方向,我很乐意做这项研究。

4

3 回答 3

4

There are 2.5 ways to do this (basically two, but it feels like there's three):

From easiest to hardest...

Option 1:

If you need tableA to reflect tableB's value, don't store the value in tableA at all, just use tableB's value. Use either a join:

select a.*, b.col1
from tableA a
join tableB b on <some join condition>

or a subselect

select *, (select col1 from tableB where <some condition>) col1
from tableA

Option 2:

If you're happy with option 1, convert it to a view, which behaves like a table (except are restrictions on updating views that are joins):

create view myview as 
select ... (one of the above selects)

Option 3:

Create a database trigger that fires when tableB's value is changed and copies the value over to the appropriate row/column in tableA

create trigger tableB_update
after update on tableB
for each row
update tableA set
tablea_col = new.col1
where id = new.tableA_id;

Note that new and old are special names given to the new and old rows so you can reference the values in the table being updated.

Choose the option that best suits your needs.

于 2014-10-24T04:06:10.393 回答
1

数据库并没有真正提供这种类型的设施,它是一个完全不同的范例。

您可以使用连接、分组或函数来获得相同的结果。

或者,如果您希望保存表示,将查询存储到视图中,使其更易于从各种接口重用。更多关于视图的信息可以在这里找到;http://www.mysqltutorial.org/mysql-views-tutorial.aspx

任何更复杂的事情,您都需要查看一些业务分析工具。

于 2014-10-24T03:49:12.920 回答
0

也许您将问题过于简单化了,但您不需要使用触发器。只需加入表格,只要“MyVal”发生更改,它就会自动通过查询获得。

CREATE TABLE Sheet1
    (
      `ID` int auto_increment primary key
    , `A` varchar(5)
    )
;

INSERT INTO Sheet1
    (`A`)
VALUES
    ('MyVal')
;

CREATE TABLE Sheet2
    (
      `ID` int auto_increment primary key
    , `Sheet1FK` int)
;

INSERT INTO Sheet2
    (`Sheet1FK`)
VALUES
    (1)
;

CREATE TABLE Sheet3
    (
      `ID` int auto_increment primary key
    , `Sheet2FK` int)
;

INSERT INTO Sheet3
    (`Sheet2FK`)
VALUES
    (1)
;

查询 1

select
        sheet3.id id3
      , sheet2.id id2
      , sheet1.id id1
      , sheet1.a
from sheet1
inner join sheet2 on sheet1.id = sheet2.sheet1fk
inner join sheet3 on sheet2.id = sheet3.sheet2fk

结果

| ID3 | ID2 | ID1 |     A |
|-----|-----|-----|-------|
|   1 |   1 |   1 | MyVal |
于 2014-10-24T06:02:58.343 回答