MySQL包含许多变量-如何将查询仅限于现有数据?
我已经浏览了所有其他提到MySQL和CONCAT_WS的内容,但它们并没有解决我的问题。我在MySQL 5.5.6x中建立了一个医疗数据库,其中包含180个表和数千个字段。数据库表和表单的处理是通过大型PHP应用程序完成的 我的SQL查询的一部分是以下代码:MySQL包含许多变量-如何将查询仅限于现有数据?,mysql,concat-ws,Mysql,Concat Ws,我已经浏览了所有其他提到MySQL和CONCAT_WS的内容,但它们并没有解决我的问题。我在MySQL 5.5.6x中建立了一个医疗数据库,其中包含180个表和数千个字段。数据库表和表单的处理是通过大型PHP应用程序完成的 我的SQL查询的一部分是以下代码: CONCAT_WS("" , COALESCE(CASE WHEN op.OP5Begleiteingriff1 = "2" THEN "Cholezystektom
CONCAT_WS(""
, COALESCE(CASE WHEN op.OP5Begleiteingriff1 = "2" THEN "Cholezystektomie " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP5Begleiteingriff2 = "2" THEN "Appendektomie " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP5Begleiteingriff3 = "2" THEN "Adhäsiolyse " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP5Begleiteingriff4 = "2" THEN "Antrum-Resektion " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP5Begleiteingriff5 = "2" THEN "Hiatoplastie " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP5Begleiteingriff6 = "2" THEN "Hernien-Reparatur " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP5Begleiteingriff7 = "2" THEN "Band-Entfernung " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP5Begleiteingriff8 = "2" THEN "Fundus-Resektion " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP5Begleiteingriff9 = "2" THEN "Rest-Gastrektomie " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP5Begleiteingriff10 = "2" THEN "Leber-Biopsie " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP5Begleiteingriff99 = "2" THEN "Andere Begleiteingriffe" ELSE CONCAT("", "") END, "NULL")
) AS "Begleiteingriffe (OP 5)",
这表示字段的内容提取
op.OP5Begleiteingriffx = "2"
=2表示已从等于-1到-10或-99的x单击相应的复选框
现在,我想将结果的显示限制在那些不是空的字段中
有没有一种优雅的方式可以在短时间内做到这一点
到目前为止,我已经实现了如下内容:
FROM dat_patient p
LEFT OUTER JOIN dat_optherapie op ON op.patID = p.ID
LEFT OUTER JOIN users_benutzer ub ON ub.ID = p.UserID
WHERE op.OP1Datum BETWEEN "1950-01-01" AND "2050-12-31"
AND (
"Begleiteingriffe (OP 1)" != "" OR "Begleiteingriffe (OP 2)" != "" OR "Begleiteingriffe (OP 3)" != "" OR "Begleiteingriffe (OP 4)" != "" OR "Begleiteingriffe (OP 5)" != ""
)
ORDER BY p.Nachname, p.Vorname, p.Gebdatum; ';
SELECT ....
.....
FROM dat_patient p
LEFT OUTER JOIN dat_optherapie op ON op.patID = p.ID
LEFT OUTER JOIN users_benutzer ub ON ub.ID = p.UserID
WHERE op.OP1Datum BETWEEN "1950-01-01" AND "2050-12-31"
--remove this part
/* AND (
"Begleiteingriffe (OP 1)" != "" OR "Begleiteingriffe (OP 2)" != "" OR "Begleiteingriffe (OP 3)" != "" OR "Begleiteingriffe (OP 4)" != "" OR "Begleiteingriffe (OP 5)" != "" ) */
-- add HAVING here
HAVING "Begleiteingriffe (OP 1)" <> ""
ORDER BY p.Nachname, p.Vorname, p.Gebdatum; ';
它仍然提供所有结果,并且不会忽略空字段:
是否有可能以这种方式处理它,或者我需要为每个
op.OP5Begleiteingriffx
就像上面提到的和。。。声明?自己的解决方案:
它不适用于使用
"Begleiteingriffe (OP 1)" != ""
或
但是,当每一种可能性都以这种方式处理时,它就起作用了
WHERE (
op.OP1Begleiteingriff1 = "2" OR
op.OP1Begleiteingriff2 = "2" OR
op.OP1Begleiteingriff3 = "2" OR
op.OP1Begleiteingriff4 = "2" OR
op.OP1Begleiteingriff5 = "2" OR
op.OP1Begleiteingriff6 = "2" OR
op.OP1Begleiteingriff7 = "2" OR
op.OP1Begleiteingriff8 = "2" OR
op.OP1Begleiteingriff9 = "2" OR
op.OP1Begleiteingriff10 = "2" OR
op.OP1Begleiteingriff99 = "2"
)
现在,我只在没有更多空字段的情况下显示结果:
自己的解决方案:
它不适用于使用
"Begleiteingriffe (OP 1)" != ""
或
但是,当每一种可能性都以这种方式处理时,它就起作用了
WHERE (
op.OP1Begleiteingriff1 = "2" OR
op.OP1Begleiteingriff2 = "2" OR
op.OP1Begleiteingriff3 = "2" OR
op.OP1Begleiteingriff4 = "2" OR
op.OP1Begleiteingriff5 = "2" OR
op.OP1Begleiteingriff6 = "2" OR
op.OP1Begleiteingriff7 = "2" OR
op.OP1Begleiteingriff8 = "2" OR
op.OP1Begleiteingriff9 = "2" OR
op.OP1Begleiteingriff10 = "2" OR
op.OP1Begleiteingriff99 = "2"
)
现在,我只在没有更多空字段的情况下显示结果:
我想,你可以尝试使用have,而不是bunch或in WHERE。可能是这样的:
FROM dat_patient p
LEFT OUTER JOIN dat_optherapie op ON op.patID = p.ID
LEFT OUTER JOIN users_benutzer ub ON ub.ID = p.UserID
WHERE op.OP1Datum BETWEEN "1950-01-01" AND "2050-12-31"
AND (
"Begleiteingriffe (OP 1)" != "" OR "Begleiteingriffe (OP 2)" != "" OR "Begleiteingriffe (OP 3)" != "" OR "Begleiteingriffe (OP 4)" != "" OR "Begleiteingriffe (OP 5)" != ""
)
ORDER BY p.Nachname, p.Vorname, p.Gebdatum; ';
SELECT ....
.....
FROM dat_patient p
LEFT OUTER JOIN dat_optherapie op ON op.patID = p.ID
LEFT OUTER JOIN users_benutzer ub ON ub.ID = p.UserID
WHERE op.OP1Datum BETWEEN "1950-01-01" AND "2050-12-31"
--remove this part
/* AND (
"Begleiteingriffe (OP 1)" != "" OR "Begleiteingriffe (OP 2)" != "" OR "Begleiteingriffe (OP 3)" != "" OR "Begleiteingriffe (OP 4)" != "" OR "Begleiteingriffe (OP 5)" != "" ) */
-- add HAVING here
HAVING "Begleiteingriffe (OP 1)" <> ""
ORDER BY p.Nachname, p.Vorname, p.Gebdatum; ';
如果可以的话,试试看。我想,你可以尝试使用have,而不是bunch of或in WHERE。可能是这样的:
FROM dat_patient p
LEFT OUTER JOIN dat_optherapie op ON op.patID = p.ID
LEFT OUTER JOIN users_benutzer ub ON ub.ID = p.UserID
WHERE op.OP1Datum BETWEEN "1950-01-01" AND "2050-12-31"
AND (
"Begleiteingriffe (OP 1)" != "" OR "Begleiteingriffe (OP 2)" != "" OR "Begleiteingriffe (OP 3)" != "" OR "Begleiteingriffe (OP 4)" != "" OR "Begleiteingriffe (OP 5)" != ""
)
ORDER BY p.Nachname, p.Vorname, p.Gebdatum; ';
SELECT ....
.....
FROM dat_patient p
LEFT OUTER JOIN dat_optherapie op ON op.patID = p.ID
LEFT OUTER JOIN users_benutzer ub ON ub.ID = p.UserID
WHERE op.OP1Datum BETWEEN "1950-01-01" AND "2050-12-31"
--remove this part
/* AND (
"Begleiteingriffe (OP 1)" != "" OR "Begleiteingriffe (OP 2)" != "" OR "Begleiteingriffe (OP 3)" != "" OR "Begleiteingriffe (OP 4)" != "" OR "Begleiteingriffe (OP 5)" != "" ) */
-- add HAVING here
HAVING "Begleiteingriffe (OP 1)" <> ""
ORDER BY p.Nachname, p.Vorname, p.Gebdatum; ';
试试看这是否可行。我不是100%确定你在问什么,但考虑到CONCAT_WS忽略空值,可能类似于CONCAT_WS,当op.OP5Begleiteingriff1=2时,CASE为Cholezystektomie END,当op.OP5Begleiteingriff2=2时,CASE为Appendektomie END。。。正如“Begleiteingriffe OP 5”?通常,这类问题很容易吸引人们的帮助。。不幸的是,有些查询没有提供任何示例数据供其他人复制这种情况;tcadidot0,很公平,我附上了一个结果截图。很抱歉,tcadidot0拼错了你的名字。我不是100%确定你在问什么,但考虑到CONCAT_WS忽略空值,可能类似于CONCAT_WS,当op.OP5Begleiteingriff1=2时,CASE,然后Cholezystektomie结束,当op.OP5BEGLEITEINGRIF2=2时,则追加终止。。。正如“Begleiteingriffe OP 5”?通常,这类问题很容易吸引人们的帮助。。不幸的是,有些查询没有提供任何示例数据供其他人复制这种情况;tcadiddot0,很公平,我随信附上了一张结果截图。很抱歉,tcadiddot0拼错了你的名字。是的,也可以,非常感谢。我自己的回答更为简单,因此,篇幅更长,也更为笨拙。是的,这也很有效,非常感谢。我自己的回答要简单得多,因此,时间更长,也更笨拙。