Tengo una consulta de actualización donde explícitamente hago referencia a la base de datos, pero MySQL todavía se queja con el mensaje: ERROR 1046 (3D000): No database selected
.MySQL "ERROR 1046 (3D000): ninguna base de datos seleccionada" en la consulta de actualización
Otras consultas que son similares a la estructura, pero usan una multa de trabajo INSERT. Otras consultas que solo realizan SELECT también funcionan bien.
Para repetir el problema en un caso de prueba, intente ejecutar estas consultas:
create table test.object1 (
id_object1 int unsigned not null auto_increment,
total int,
weight int,
dt datetime,
primary key (id_object1)
) engine=InnoDB;
create table test.object2 (
id_object2 int unsigned not null auto_increment,
primary key (id_object2)
) engine=InnoDB;
create table test.score (
id_object1 int unsigned not null,
id_object2 int unsigned not null,
dt datetime,
score float,
primary key (id_object1, id_object2),
constraint fk_object1 foreign key (id_object1) references object1 (id_object1),
constraint fk_object2 foreign key (id_object2) references object2 (id_object2)
) engine=InnoDB;
insert into test.object1 (id_object1, total, weight, dt) values (1, 0, 0, '2012-01-01 00:00:00');
insert into test.object1 (id_object1, total, weight, dt) values (2, 0, 0, '2012-01-02 00:00:00');
insert into test.object2 (id_object2) values (1);
insert into test.score (id_object1, id_object2, dt, score) values (1, 1, '2012-01-03 00:00:00', 10);
insert into test.score (id_object1, id_object2, dt, score) values (2, 1, '2012-01-04 00:00:00', 8);
update test.object1 p
join (
select ur.id_object1, sum(ur.score * ur.weight) as total, count(*) as weight
from (
select lur.*
from (
select s.id_object1, s.id_object2, s.dt, s.score, 1 as weight
from test.score as s
join test.object1 as o1 using(id_object1)
where s.dt > o1.dt
order by s.id_object1, s.id_object2, s.dt desc
) as lur
group by lur.id_object2, lur.id_object1, date(lur.dt)
order by lur.id_object1, lur.id_object2
) as ur
group by ur.id_object1
) as r using(id_object1)
set
p.total = p.total + r.total,
p.weight = p.weight + r.weight,
p.dt = now();
Nota: Estoy corriendo estas consultas desde un entorno PHP y no he utilizado explícitamente mysql_select_db ('test'), porque prefiero no hacerlo y ninguna de las otras (¡muchas!) consultas lo requiere. Estoy seguro de que usar mysql_select_db resolvería mi problema, pero me gustaría saber por qué exactamente esta consulta en particular no funciona.
Por el bien de comparación: si lo ejecuta esta consulta simple, también sin utilizar mysql_select_db, todo funciona bien:
update test.object1 set total=1, weight=1, dt=now() where id_object1=1;
He buscado en vano. El único que encontré que estuvo cerca, era este informe de error: http://bugs.mysql.com/bug.php?id=28551 y sobre todo el mensaje final (sin respuesta) ...
Probablemente sea el primero ... – Shoe
esto puede sonar tonto, pero ¿podría reemplazar "ahora()" por una fecha manual al azar en su lugar e intentarlo de nuevo? – Sebas
@Sebas Lo acabo de hacer, no hay diferencia. ¿Por qué importaría eso? – webtweakers