MySQL包含许多变量-如何将查询仅限于现有数据?

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

我已经浏览了所有其他提到MySQL和CONCAT_WS的内容,但它们并没有解决我的问题。我在MySQL 5.5.6x中建立了一个医疗数据库,其中包含180个表和数千个字段。数据库表和表单的处理是通过大型PHP应用程序完成的

我的SQL查询的一部分是以下代码:

    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拼错了你的名字。是的,也可以,非常感谢。我自己的回答更为简单,因此,篇幅更长,也更为笨拙。是的,这也很有效,非常感谢。我自己的回答要简单得多,因此,时间更长,也更笨拙。