2011-05-23 12 views
24

Soy algo nuevo en SQL, y realmente solo estoy interactuando con él lo suficiente como para que funcione una base de datos de puntaje alto. Estoy usando un script php para acceder a mi base de datos MySQL en línea. De todos modos.MySQL: ¿combina INSERT, VALUES y SELECT?

Lo que tengo es 2 tablas, jugador y puntaje. El jugador tiene una identificación, Id. De dispositivo único y nombre elegido. La puntuación tiene las cosas habituales que esperarías.

Lo que realmente me gustaría hacer en una sola consulta (para reducir la complejidad ...) es la combinación de las sintaxis de

INSERT INTO scores VALUES 
and INSERT INTO scores SELECT... 

en una especie de monstruo, como

INSERT INTO scores(score,difficulty,playerid) 
    VALUES(TheScoreThatImProviding,TheDifficultyThatImProviding, (SELECT 
     id FROM player WHERE uniqueDeviceId = TheUniqueIdThatImProviding) 
    ) 

Si eso tiene sentido. Quiero buscar el playerId (3er "valor") y mezclar el resultado de esa selección con la entrada de los VALORES provistos.

¿Esto es posible? Todos los resultados de Google encontrados ya sea tienen todos los VALORES o todos SELECCIONADOS.

Respuesta

46

Tiene sentido y se llama INSERT SELECT. Se trata de una consulta de ejemplo para el uniqueDeviceId 123, Score 5 y dificultad 'fácil':

INSERT INTO scores (score, difficulty, playerid) 
    SELECT 5, 'easy', id 
    FROM player WHERE uniqueDeviceId = 123; 
+0

Entonces, ¿puedo decir en la parte SELECCIONADA los valores codificados, y no va a buscar una columna llamada así cuando busca en la tabla de jugadores? – Eric

+0

Los números se pasan directamente sin buscar columnas. Cuerdas también. – Alp

+0

Excelente. Muchas gracias. Acabo de probar esa sintaxis y de hecho funciona. – Eric

4

Según this page estás cerca. Pero ponga todos los valores en su selección. Algo así como:

insert into scores (score, difficulty, playerid) 
    select TheScoreThatImProviding, TheDifficultyThatImProviding, player.id 
     from player where uniqueDeviceId = TheUniqueIdThatImProviding 
1

¿Qué pasa con este enfoque:

INSERT INTO `tableA` SET 
      columnA = (SELECT `columnY` FROM `tableY` WHERE `id` = 2), 
      columnB = (SELECT `columnZ` FROM `tableB` WHERE `id` = 3); 

Yo no como punto de referencia todavía. Pero usar múltiples declaraciones SELECT cargará el servidor de la base de datos. El lado positivo de este enfoque es la legibilidad.