2012-01-31 19 views
9

Soy nuevo en MYSQL, y no puedo resolver o incluso con tantas respuestas en este foro, no puedo identificar el error en esta afirmación. Estoy usando la base de datos MYSQL.ACTUALIZACIÓN con ORDEN POR y LIMITE no funciona en MYSQL

Tengo 2 tablas: Ratemaster y tarifas, en las que un cliente puede tener 1 producto con diferentes tarifas. Debido a esto, hay una duplicación de los campos del cliente y del producto, solo cambia el campo de la tarifa. Ahora Table Ratemaster tiene todos los campos: id, código de cliente, producto, tasa, usuario mientras que Table Rates solo tiene: id, cust code, Rate, user. - el campo de usuario es para verificar session_user.

Ahora Table Ratemaster tiene 3 registros con todos los valores de campo iguales, excepto el campo de tasa vacío. Table tarifas tiene diferentes tarifas. Quiero que todas las tarifas se actualicen en Ratemaster desde la tabla de tarifas. Soy incapaz de hacer esto con UPDATE y LIMIT comandos mysql, es que da un error como:

Incorrect usage of UPDATE and LIMIT

UPDATE Ratemaster, Rates 
SET Ratemaster.Rate=Rates.Rate 
WHERE Ratemaster.user=Rates.user 
LIMIT 1 
+1

¿Dónde está su 'ORDER BY' ??? (su pregunta dice con ORDER BY) – ManseUK

+0

Hola, lo he intentado con ORDER BY también, da el mismo error: uso incorrecto de UPDATE y ORDER BY. – user1114409

+0

Entonces nos muestran que consulta - LIMIT es de sentido ORDEN DE ACTUALIZACIÓN – symcbean

Respuesta

15

Por lo general, se puede utilizar LIMIT y ORDER en sus UPDATE declaraciones, pero en su caso no es así, como está escrito en la MySQL Documentation 12.2.10. UPDATE Syntax:

For the multiple-table syntax, UPDATE updates rows in each table named in table_references that satisfy the conditions. In this case, ORDER BY and LIMIT cannot be used.

intente lo siguiente:

UPDATE Ratemaster 
SET Ratemaster.Rate = 
(
    SELECT Rates.Rate 
    FROM Rates 
    WHERE Ratemaster.user = Rates.user 
    ORDER BY Rates.id 
    LIMIT 1 
) 
+0

En tal situación, qué más debería hacerse para que funcione, ayúdenme con una solución a mi problema. – user1114409

+0

agregó una consulta de ejemplo, pero no sé exactamente lo que quiere hacer. –

+0

Esto actualizará ** todas las ** filas de la tabla 'Ratemaster'. –

-3

El problema es que LIMIT solo se debe usar con las sentencias SELECT, ya que limita el número de filas devueltas por la consulta.

Desde: http://dev.mysql.com/doc/refman/5.5/en/select.html

The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants, with these exceptions:

Within prepared statements, LIMIT parameters can be specified using ? placeholder markers. 

Within stored programs, LIMIT parameters can be specified using integer-valued routine parameters or local variables as of MySQL 5.5.6. 

With two arguments, the first argument specifies the offset of the first row to return, and the second specifies the maximum number of rows to return. The offset of the initial row is 0 (not 1):

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15

To retrieve all rows from a certain offset up to the end of the result set, you can use some large number for the second parameter. This statement retrieves all rows from the 96th row to the last:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

With one argument, the value specifies the number of rows to return from the beginning of the result set:

SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows

In other words, LIMIT row_count is equivalent to LIMIT 0, row_count.

For prepared statements, you can use placeholders. The following statements will return one row from the tbl table:

SET @a=1; PREPARE STMT FROM 'SELECT * FROM tbl LIMIT ?'; EXECUTE STMT USING @a;

The following statements will return the second to sixth row from the tbl table:

SET @skip=1; SET @numrows=5; PREPARE STMT FROM 'SELECT * FROM tbl LIMIT ?, ?'; EXECUTE STMT USING @skip, @numrows;

For compatibility with PostgreSQL, MySQL also supports the LIMIT row_count OFFSET offset syntax.

If LIMIT occurs within a subquery and also is applied in the outer query, the outermost LIMIT takes precedence. For example, the following statement produces two rows, not one:

(SELECT ... LIMIT 1) LIMIT 2;

+0

Hola, todo lo que necesito es actualizar desde la Tabla B campo1 con la Tabla A campo2 donde todos los registros son duplicados para un usuario, necesito su ayuda para resolver esta situación, sin límite, el comando ACTUALIZAR actualiza todos los registros con el mismo valor – user1114409

+0

@ user1114409 : La consulta que especificó simplemente hará lo que le indicó (es decir, el contenido de SET) para TODOS los campos que coincidan con la cláusula WHERE. ¿Cuál es el diseño de tu mesa? Tal vez Ratemaster.user = Rates.user resuelve a verdadero más a menudo de lo que piensas. – Karolos

+0

Hola Karolos, sí, tienes razón, la cláusula where es lo que necesito limitar, de modo que se actualiza solo para registrar los criterios coincidentes. En la pregunta anterior he dado claramente el diseño de la tabla, es muy simple. Verifica el 2do párrafo por el mismo. – user1114409

1

Leer artículo sobre How to use ORDER BY and LIMIT on multi-table updates in MySQL

For the multiple-table syntax, UPDATE updates rows in each table named in table_references that satisfy the conditions. In this case, ORDER BY and LIMIT cannot be used.

+0

Lol, acabo de leer ese artículo y por un momento estuve en estado de shock. El tipo me describió trabajando en un proyecto que parece ser exactamente el mismo en el que trabajo;) – John

5

Salam Puede utilizar este método y que funcione correctamente!

UPDATE Ratemaster, Rates 
SET Ratemaster.Rate=Rates.Rate 
WHERE Ratemaster.user=Rates.user 
ORDER BY Rates.id 
LIMIT 1 
Cuestiones relacionadas