diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result
index 6c9ec9d8297dac6a79d7416287b8b510c3de92fd..2df60944999388bfeabf8b3918b39a6a3c15f1aa 100644
--- a/mysql-test/r/select.result
+++ b/mysql-test/r/select.result
@@ -2582,3 +2582,19 @@ a
 254
 255
 drop table t2;
+CREATE TABLE t1 (a int, b int, c int);
+INSERT INTO t1
+SELECT 50, 3, 3 FROM DUAL
+WHERE NOT EXISTS
+(SELECT * FROM t1 WHERE a = 50 AND b = 3);
+SELECT * FROM t1;
+a	b	c
+50	3	3
+INSERT INTO t1
+SELECT 50, 3, 3 FROM DUAL
+WHERE NOT EXISTS
+(SELECT * FROM t1 WHERE a = 50 AND b = 3);
+SELECT * FROM t1;
+a	b	c
+50	3	3
+DROP TABLE t1;
diff --git a/mysql-test/t/select.test b/mysql-test/t/select.test
index caa9e332e5798ca0022a1f05e4dd778af5e1ab23..893b9ba9267a809b0d39166bca7c5faad6d3a4ba 100644
--- a/mysql-test/t/select.test
+++ b/mysql-test/t/select.test
@@ -2138,3 +2138,21 @@ insert into t2 values (0), (254), (255);
 explain select * from t2 where a > -1;
 select * from t2 where a > -1;
 drop table t2;
+
+#
+# Bug #11745: SELECT ... FROM DUAL with WHERE condition
+#
+
+CREATE TABLE t1 (a int, b int, c int);
+INSERT INTO t1
+  SELECT 50, 3, 3 FROM DUAL
+    WHERE NOT EXISTS
+      (SELECT * FROM t1 WHERE a = 50 AND b = 3);
+SELECT * FROM t1;
+INSERT INTO t1
+  SELECT 50, 3, 3 FROM DUAL
+    WHERE NOT EXISTS
+      (SELECT * FROM t1 WHERE a = 50 AND b = 3);
+SELECT * FROM t1;
+
+DROP TABLE t1;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index a70fa1c8d5e0c852b8593c88328ce631a230ce4c..5b4eab36dd20d2180c62834931965d20590d4142 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -1072,7 +1072,7 @@ JOIN::exec()
     else
     {
       result->send_fields(fields_list,1);
-      if (!having || having->val_int())
+      if (cond_value != Item::COND_FALSE && (!having || having->val_int()))
       {
 	if (do_send_rows && (procedure ? (procedure->send_row(fields_list) ||
                                           procedure->end_of_records())
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 2587ce7e1a54011ff6564cff05290fd5e981afdd..be8ead8e15755c70c75286630bb455206be71d03 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -2459,7 +2459,7 @@ select_into:
 select_from:
 	  FROM join_table_list where_clause group_clause having_clause
 	       opt_order_clause opt_limit_clause procedure_clause
-        | FROM DUAL_SYM opt_limit_clause
+        | FROM DUAL_SYM where_clause opt_limit_clause
           /* oracle compatibility: oracle always requires FROM clause,
              and DUAL is system table without fields.
              Is "SELECT 1 FROM DUAL" any better than "SELECT 1" ?