Uso de mayor que o igual a (> =) y menor que o igual a (<=) en sentencias SQL SELECT y DOP

He intentado hacer una pequeña función para determinar las calificaciones de un conjunto de rangos almacenados en una base de datos MySQL, es decir, A está entre 80 y 100, A- está entre 74 y 79, y así sucesivamente. Estoy usando PDO y declaraciones preparadas. Sin embargo, PDO no me da el resultado. ¿Podría alguien ayudarme a resolver esto? A continuación, la vista previa de la mesa

revisión de la mesa

prepare("SELECT * FROM grading WHERE ? BETWEEN min AND max"); $pk->bindParam(1,$mark); $pk->execute(); $ind=$pk->fetch(PDO::FETCH_ASSOC); echo $ind['grade']; } catch(PDOexception $f) { echo $f->getMessage(); } //however when i try this it displays the grade. whats wrong with the previous code? try{ $pk = $db->prepare("SELECT * FROM grading WHERE 85 BETWEEN min AND max"); $pk->execute(); $ind=$pk->fetch(PDO::FETCH_ASSOC); echo $ind['grade']; } catch(PDOexception $f) { echo $f->getMessage(); } ?> 

Intenta ajustar la lógica un poco. Al igual que Phoenix Wright, a veces todo lo que hace falta es darle la vuelta a las cosas para resolverlas:

 $pk = $db->prepare("SELECT `grade` FROM `grading` WHERE ? BETWEEN `min` and `max`"); $pk->execute(array($mark)); $ind = $pk->fetch(PDO::FETCH_ASSOC); echo $ind['grade']; 

Usar un valor como primer operando para BETWEEN e IN no es algo en lo que mucha gente pensaría, pero es tan poderoso;)


Más importante aún (y gracias a Fred -ii- por ayudarme accidentalmente a darme cuenta), min y max son nombres de funciones. Si desea usarlos como nombres de columna, debe envolverlos en marcadores, como lo he hecho en mi código anterior.

Como regla general, siempre debe poner backticks alrededor de los nombres de su tabla y columna. No hacerlo es similar a escribir $foo = bar; en PHP. Claro, funcionará , pero si la bar resulta ser una constante o un nombre de función, entonces todo el infierno se desata.

Puedes escribir 2 consultas diferentes:

  $pk = $db->prepare("SELECT * FROM grading WHERE max >=:max AND min <=:min"); 

O

 $pk = $db->prepare("SELECT SOMETHING FROM grading WHERE SOMETHING BETWEEN max AND min"); 

Pero en tu caso, el primero funciona. el problema es que está usando la misma variable $mark para min y max