【问题标题】:MySQL returns all rows when field=0 from SECOND Select query当字段 = 0 来自 SECOND Select 查询时,MySQL 返回所有行
【发布时间】:2015-01-22 13:06:42
【问题描述】:

这个案例类似于:S.O Question; mySQL returns all rows when field=0,接受的答案是一个非常简单的技巧,用单引号包围零

来自:

SELECT * FROM table WHERE email=0 

到:

SELECT * FROM table WHERE email='0'

但是,我的情况略有不同,因为我的查询类似于:

   SELECT * FROM table WHERE email=( 
         SELECT my_column_value FROM myTable WHERE my_column_value=0 AND user_id =15 LIMIT 1 )

从某种意义上说,就像简单地说:SELECT * FROM table WHERE email=0,但现在是Second Query

请注意:必须使用SECOND QUERY

当我尝试时:SELECT * FROM table WHERE email='( SELECT my_column_value FROM myTable WHERE my_column_value=0 LIMIT 1 )' (注意第二个查询中的单引号)

MySql 尖叫 Errors near '(.

如何做到这一点

任何建议都非常荣幸


EDIT1:查询的视觉视角

在此处查看 STEN_TB:http://snag.gy/Rq8dq.jpg

现在,主要目标是获得sten_h 其中rawscore_h = 0;

当前查询作为一个整体。

SELECT sten_h
                FROM sten_tb
                WHERE rawscore_h =  (
                SELECT `for_print_stens_rowscore`
                FROM `for_print_stens_tb`
                WHERE `for_print_stens_student_id` =3
                AND `for_print_stens_factor_name` = 'Factor H' )

Second Query 的结果可以是任何数字,包括 ZERO

来自>=1 的任何数字都有效并从sten_h 返回单个对应 值。只有=0 不起作用,它返回所有行

这就是问题所在。

对此的正确答案或解决方案

以防万一有人最终陷入这种悖论,接受答案就可以了。

STEN_TB:http://snag.gy/Rq8dq.jpg

在此处查看所需的Query 结果:http://snag.gy/wa4yA.jpg

【问题讨论】:

  • 试过IN 仍然返回所有行
  • 您只需要在值周围加上引号:WHERE my_column_value='0'
  • @DariusX。这就是我在问题中所说的......现在的问题,当它是第二个查询的结果时如何处理零??
  • @UniversalGrasp,尝试从 mytable 中选择 cast(my_column as varchar(1))
  • 我收到错误:#1064 -您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 4 行的 'varchar(1)) FROM for_print_stens_tb WHERE for_print_stens_student_id' 附近使用正确的语法`

标签: mysql select


【解决方案1】:

我相信您的问题在于隐式数据类型转换。您可以显式地进行这些数据类型转换,以获得控制权。

(将文字 0 括在单引号中的“技巧”,使文字成为字符串文字,而不是数字。)

在更一般的情况下,您可以使用CASTCONVERT 函数来显式指定数据类型转换。您可以在任何需要的地方使用表达式代替列名...

例如,要让my_column_value返回的值与email列的数据类型相匹配,假设email是字符类型,类似:

... email = (SELECT CONVERT(my_column_value,CHAR(255)) FROM myTable WHERE ...

或者,将文字整数值作为字符串值:

 ... FROM myTable WHERE my_column_value = CONVERT(0,CHAR(30)) ...

【讨论】:

  • SUPERB !!....当我尝试 (CONVERT(...,...)) 技巧时它起作用了。再次感谢你。 (接受)
【解决方案2】:

如果 email 和 my_column_value 只是表示真或假,那么它们几乎肯定应该是 BIT NOT NULL 或您的架构用于布尔值的其他双值类型。 (您的 ORM 可能会使用一个特定的。)铸造通常是由于糟糕的设计而成为必要的黑客攻击。

如果它应该是特定用户,那么您不应该使用 LIMIT,因为表是无序的并且不会返回特定用户。在您的问题中解释您的查询应该返回什么,包括您所说的“15th”的确切含义。

(拥有所有这些相似的列是糟糕的设计:rawscore_a、sten_a、rawscore_b、sten_b、...。使用包含两列的表:rawscore、sten。)

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2017-10-27
    • 2017-07-17
    相关资源
    最近更新 更多