如何向MySQL视图传递动态参数

8

我在MySQL中创建了以下视图:

CREATE VIEW MYVIEW AS (
SELECT A.FNAME
     , A.LNAME
     , B.EMAIL
FROM EMPLOYEE A, EMPEMAIL B
WHERE A.EID = :empId
  AND A.EID = B.EID
AND B.EMAILTYP = :emailType)

我需要在运行时获取所需的empIdemailType的结果,因此必须使它们动态化。

请问代码应该做哪些更改?

提前致谢。

3个回答

17

你可以使用这个解决方案,并结合一个函数使用 -

CREATE FUNCTION func() RETURNS int(11)
  RETURN @var;

CREATE VIEW view1 AS
  SELECT * FROM table1 WHERE id = func();

使用示例:

SET @var = 1;
SELECT * FROM view1;

14

只创建视图而不使用参数(例如,仅处理连接):

CREATE VIEW MYVIEW AS (
SELECT A.FNAME
     , A.LNAME
     , B.EMAIL
     , A.EID AS EID             -- added to be used in the WHERE
     , B.EMAILTYP AS EMAILTYP   -- added to be used in the WHERE
FROM EMPLOYEE A, EMPEMAIL B
WHERE A.EID = B.EID)

当您进行查询时,请应用动态参数:

SELECT FNAME, LNAME, EMAIL
FROM   my_view
WHERE  eid = 'your_empId' AND emailtyp = 'your_emailType'

请注意上面显示的WHERE子句,它使用了在VIEW中声明的两个额外字段。


谢谢回复,但我不想在结果列中显示A.EID和B.EMAILTYP的值。我应该做什么更改? - java baba
只查询您想要的字段-我修改了我的答案以展示这一点。 - Mureinik
我想只选择三列 --> A.FNAME,A.LNAME,B.EMAIL - java baba
当我们需要执行参数化的WHERE子句时,我们需要跳过一些记录,在您的实现中,这是可以的,除非有人认为可以获取所有记录,然后在大数据集上手动执行。参数化视图的问题仍未解决。 - ad4s
问题在于视图将获取比您想要的更大的数据集。这是我的当前问题,我需要在我的视图中使用动态WHERE,否则我的性能会下降。 - Douglas Gaskell
@DouglasGaskell 因为视图的 SQL 是在运行时执行的,所以我认为查询优化器会像直接给出带有过滤器的 SQL 一样优化带有过滤器的视图。(注意:这只是猜测;EXPLAIN PLAN 应该能告诉真实情况)。@javababa 选择存储列很便宜。如果你只想要三列,就从视图中选择那些列。不要考虑过度优化视图。 - ADTC

0

MySQL视图的行为类似于表格;

假设您的视图是;

CREATE VIEW view_fetch_part_data AS
SELECT 
p.new_study_no, 
p.study_no AS fk_part, 
p.is_participant_available, 
p.part_unavailable_reason, 
p.name, 
p.sync_date AS part_syncdate,
ca.timepoint, 
ca.is_participant_available AS ca_participant_available, 
ca.part_unavailable_reason AS ca_part_unavailable_reason,  
ca.last7days_child_symptoms, 
ca.illness_timeOff_days, 
hm.names AS hm_names, 
hm.age AS hm_age, 
hm.sex AS hm_sex, 
hm.relationship, 
FROM participants p 
LEFT JOIN clinical_assessments ca
ON p.study_no = ca.fk_part 
LEFT JOIN hh_members hm
ON p.study_no = hm.fk_part 
LEFT JOIN hh_rooms hr
ON p.study_no = hr.fk_part ;

执行它将会得到:

SELECT * FROM view_fetch_part_data

view of the query

然后像普通表格一样应用where子句;

SELECT * FROM view_fetch_part_data WHERE fk_part = 211123;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接