8722 sujets

Développement web côté serveur, CMS

Bonjour,
voici ma requête
UPDATE room SET c_date = '2021-08-06', d_date = '2021-08-16' WHERE c_date = '0000-01-01' AND d_date = '0000-01-01' AND hotel_id = (SELECT TOP(1) hotel_id FROM room WHERE hotel_id = '1' ORDER BY hotel_id DESC);

En gros je voudrais que ça update la première ligne de ma table lorsque c_date, d_date = '0000-01-01' et hotel_id = '1'.

Le soucis c'est que cela me retourne l'erreur indiquée dans le titre. ERROR 1305 FUNCTION booking.top does not exist.
Si quelqu'un pouvait me dire qu'elle est la requête exact pour faire ce que je souhaite.

Merci d'avance
Modifié par Don-pasqual (20 Jul 2021 - 15:44)
Salut,

Ta requête m'a l'air très moche, la partie hotel_id = (select hotel_id from room where hotel_id = 1) grosso merdo ça veut juste dire hotel_id = 1 a priori..

Tu utilises quoi comme SGBD ? Si c'est du mysql/mariadb, c'est LIMIT le mot clé.
A priori je verrais une première requête dans ce genre la (selon comment sont foutu tes liens entre tables il faut peut être aussi vérifier la valeur de l'hotel du coup j'ai mis en commentaire avec les -- , c'est toi qui voit si la ligne sert ou pas) :

SELECT room_id
FROM room
WHERE
c_date = '0000-01-01' 
AND d_date = '0000-01-01'
-- hotel_id = '1'
ORDER BY room_id
LIMIT 1;


Et une fois que tu as ta requête qui est bonne tu complètes en faisant le update :

UPDATE room 
SET c_date = '2021-08-06', d_date = '2021-08-16'
WHERE room_id = 
(SELECT room_id
FROM room
WHERE
c_date = '0000-01-01' 
AND d_date = '0000-01-01'
-- hotel_id = '1'
ORDER BY room_id
LIMIT 1)
-- AND hotel_id='1'
;


(Je n'ai pas testé mais dans l'idée ça devrait être dans ce genre la je pense)

Edit : Pour les hotel_id j'ai laissé les guillemets comme dans ton exemple, mais si c'est des entiers, ils ne faut pas les mettre
Edit 2 : j'avais zappé ton order by
Modifié par Mathieuu (20 Jul 2021 - 16:09)
En modifiant un peu j'y suis arrivé car il m'envoyait comme erreur que je ne peux pas spécifier room pour update dans la clause from.
update room set c_date = '2021-08-06', d_date = '2021-08-16', b_date = '2021-07-20' where id = (select id from hotel where hotel_id = '1' and d_date = '0000-01-01' order by id limit 1);


Le soucis c'est que maintenant comment je peux faire pour en cas d'une autre réservation sur le même hotel ça réservera la second chambre ?
Modifié par Don-pasqual (20 Jul 2021 - 16:38)
Salut,

désolé j'ai intégré la requête dans le update sans faire gaffe que cela ne fonctionne pas si c'est la même table.
Dans ce cas la il faut juste simplifié la requête :


UPDATE room 
SET c_date = '2021-08-06', d_date = '2021-08-16'
WHERE
c_date = '0000-01-01' 
AND d_date = '0000-01-01'
-- AND hotel_id='1'
ORDER BY room_id
LIMIT 1
;


Edit : Je viens de voir que tu as éditer ton poste entre temps, la pour le coup ta requête fait n'importe quoi, tu ne peux pas mélanger les ids des rooms avec les ids des hotels, ta jointure est fausse Smiley fache
Modifié par Mathieuu (20 Jul 2021 - 16:47)
Meilleure solution
Oui excuse moi, en faite j'ai fait quelques modifs pour essayé mais comme dit ça ne donnait pas le résultat attendu.
Maintenant ça fonction.
Je te remercie Smiley biggrin
et merci d'avoir répondu si rapidement
Modifié par Don-pasqual (20 Jul 2021 - 16:52)