Query 2

di il
9 risposte

Query 2

Selezionare i nomi dei clienti che hanno prenotato solo tavoli da 6 posti.
Cliente(idcliente,nome,cognome)
Prenota(idclientec,idtavolot)
Tavolo(idtavolo,numposti)

select c.idcliente,c.nome
from cliente as c
and not exist(select*
from prenota as p
where p.idclientec=c.idcliente
and not exist(select*
from tavolo as t
where t.numposti='6' and
t.idtavolo=p.idtavolot));


Non capisco dove sto sbagliando...spero sono stato chiaro

9 Risposte

  • Re: Query 2

    Io proverei così (non l'ho testata, ovviamente, quindi verifica eventuali errori):
    
    select c.idcliente, c.nome
    from clienti c inner join prenota p on c.idcliente=p.idcliente
    inner join tavolo t on t.idtavolo=p.idtavolo
    where t.numposti=6 
    
  • Re: Query 2

    Quale sarebbe la differenza?
  • Re: Query 2

    In realtà la query di gibra non è del tutto corretta: se lo stesso cliente prenota sia un tavolo da 6 posti che un altro da ad esempio 2 posti, allora non dovrebbe essere selezionato, mentre con la query di gibra vengono selezionati tutti i clienti che prenotano almeno un tavolo da 6 posti.

    La query che credo sia corretta dovrebbe essere:
    
    SELECT DISTINCT C.*
    FROM Cliente C JOIN Prenota P ON C.idcliente = P.idclientec
    WHERE P.idclientec NOT IN (
        -- Prenotazioni a tavoli con posti <> 6
        SELECT DISTINCT P.idclientec
        FROM Prenota P JOIN Tavolo T on P.idtavolot = T.idtavolo
        WHERE T.numposti <> 6
    )
    
  • Re: Query 2

    Grazie...poi ho risolto con le negazioni
  • Re: Query 2

    Attenzione: non è per nulla scontato che una query che utilizzi IN e NOT IN sia in generale efficiente, soprattutto con mysql, e soprattutto per le versioni più vecchie (è difficile dire per quale DB sia la domanda, ma "a naso" direi... mysql visto che è il forum relativo
  • Re: Query 2

    Della ha scritto:


    la query di gibra vengono selezionati tutti i clienti che prenotano almeno un tavolo da 6 posti.
    Questa era appunto la richiesta.
  • Re: Query 2

    In realtà chiede "Selezionare i nomi dei clienti che hanno prenotato solo tavoli da 6 posti."
  • Re: Query 2

    Della ha scritto:


    In realtà chiede "Selezionare i nomi dei clienti che hanno prenotato solo tavoli da 6 posti."
    Appunto.
  • Re: Query 2

    Prova a eseguire la tua query e la mia sul DB qui di seguito, e vedi cosa cambia. Nel dump viene creato e usato un DB chiamato "temp", guarda che tu non ne abbia uno omonimo.
    
    -- phpMyAdmin SQL Dump
    -- version 4.5.3.1
    -- http://www.phpmyadmin.net
    --
    -- Host: 192.168.30.23
    -- Creato il: Gen 10, 2016 alle 17:28
    -- Versione del server: 5.5.46-0+deb8u1
    -- Versione PHP: 5.6.14-0+deb8u1
    
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
    
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8mb4 */;
    
    --
    -- Database: `temp`
    --
    CREATE DATABASE IF NOT EXISTS `temp` DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci;
    USE `temp`;
    
    -- --------------------------------------------------------
    
    --
    -- Struttura della tabella `Cliente`
    --
    
    DROP TABLE IF EXISTS `Cliente`;
    CREATE TABLE `Cliente` (
      `idcliente` int(11) NOT NULL,
      `nome` text COLLATE latin1_general_ci NOT NULL,
      `cognome` text COLLATE latin1_general_ci NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
    
    --
    -- Dump dei dati per la tabella `Cliente`
    --
    
    INSERT INTO `Cliente` (`idcliente`, `nome`, `cognome`) VALUES
    (1, 'Marco', 'Rossi'),
    (2, 'Paolo', 'Verdi'),
    (3, 'Giacomo', 'Neri'),
    (4, 'Carlo', 'Gialli');
    
    -- --------------------------------------------------------
    
    --
    -- Struttura della tabella `Prenota`
    --
    
    DROP TABLE IF EXISTS `Prenota`;
    CREATE TABLE `Prenota` (
      `idclientec` int(11) NOT NULL,
      `idtavolot` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
    
    --
    -- Dump dei dati per la tabella `Prenota`
    --
    
    INSERT INTO `Prenota` (`idclientec`, `idtavolot`) VALUES
    (1, 1),
    (1, 2),
    (2, 3),
    (2, 4),
    (3, 5);
    
    -- --------------------------------------------------------
    
    --
    -- Struttura della tabella `Tavolo`
    --
    
    DROP TABLE IF EXISTS `Tavolo`;
    CREATE TABLE `Tavolo` (
      `idtavolo` int(11) NOT NULL,
      `numposti` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
    
    --
    -- Dump dei dati per la tabella `Tavolo`
    --
    
    INSERT INTO `Tavolo` (`idtavolo`, `numposti`) VALUES
    (1, 6),
    (2, 6),
    (3, 6),
    (4, 2),
    (5, 4);
    
    --
    -- Indici per le tabelle scaricate
    --
    
    --
    -- Indici per le tabelle `Cliente`
    --
    ALTER TABLE `Cliente`
      ADD PRIMARY KEY (`idcliente`);
    
    --
    -- Indici per le tabelle `Prenota`
    --
    ALTER TABLE `Prenota`
      ADD PRIMARY KEY (`idclientec`,`idtavolot`),
      ADD KEY `idtavolot` (`idtavolot`);
    
    --
    -- Indici per le tabelle `Tavolo`
    --
    ALTER TABLE `Tavolo`
      ADD PRIMARY KEY (`idtavolo`);
    
    --
    -- AUTO_INCREMENT per le tabelle scaricate
    --
    
    --
    -- AUTO_INCREMENT per la tabella `Cliente`
    --
    ALTER TABLE `Cliente`
      MODIFY `idcliente` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
    --
    -- AUTO_INCREMENT per la tabella `Tavolo`
    --
    ALTER TABLE `Tavolo`
      MODIFY `idtavolo` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
    --
    -- Limiti per le tabelle scaricate
    --
    
    --
    -- Limiti per la tabella `Prenota`
    --
    ALTER TABLE `Prenota`
      ADD CONSTRAINT `Prenota_ibfk_2` FOREIGN KEY (`idtavolot`) REFERENCES `Tavolo` (`idtavolo`),
      ADD CONSTRAINT `Prenota_ibfk_1` FOREIGN KEY (`idclientec`) REFERENCES `Cliente` (`idcliente`);
    
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    
Devi accedere o registrarti per scrivere nel forum
9 risposte