Come trovare tutte le pizzerie che servono ogni pizza mangiata da persone di età superiore ai 30 anni?

StackOverflow https://stackoverflow.com/questions/7821695

Domanda

Sto seguendo il corso di database di Stanford e c'è una domanda in cui abbiamo Trova tutte le pizzerie che servono ogni pizza mangiata da persone di età superiore ai 30 anni Usando solo l'algebra relazionale.

Il problema consiste in Un piccolo database con quattro relazioni:

Person(name, age, gender)       // name is a key
Frequents(name, pizzeria)       // [name,pizzeria] is a key
Eats(name, pizza)               // [name,pizza] is a key
Serves(pizzeria, pizza, price)  // [pizzeria,pizza] is a key

So come trovare quali persone di Pizza oltre i 30 anni mangiano e ne fanno un prodotto incrociato, in modo da poter controllare quale pizzeria ha entrambi.

Posso fare un elenco di tutte le pizzeria che servono quelle pizza, ma non ho idea di come rimuovere qualsiasi pizzeria che abbia solo una combinazione (come Dominos).

Chicago Pizza   cheese  cheese
Chicago Pizza   cheese  supreme
Chicago Pizza   supreme cheese
Chicago Pizza   supreme supreme
Dominos         cheese  cheese
Dominos         cheese  supreme

I forum di domande e risposte ci dicono di usare la divisione e indicarci diverse presentazioni. Mentre ottengo quale sarebbe il risultato dell'azione, non capisco davvero come tradurre la formula in sintassi di algebra relazionale.

Qualcuno potrebbe spiegarmi cosa mi manca, si spera senza dare la soluzione?

Altri suggerimenti

Sicuramente questo è il concetto di operatore di divisione nell'algebra relazionale.

Ma ho provato su quel corso. La sintassi dell'algebra relazionale RA non supporta l'operatore Dev. Quindi ho usato Diff e Cross invece. Ecco la mia soluzione:

\project_{pizzeria}(Serves)
\diff
\project_{pizzeria}(
    (\project_{pizzeria}(Serves) 
    \cross 
    \project_{pizza}(\project_{name}(\select_{age>30}(Person))\join Eats))
    \diff
    \project_{pizzeria,pizza}(Serves)
)
  1. Sulla diapositiva 6, si noti che n è (3 1 7).

  2. Nella diapositiva successiva, o / n si traduce (4 8).

  3. Se o avrebbe anche (12 3) e (12 1) ma no (12 7), 12 non farebbe parte di o / n.

Dovresti essere in grado di compilare un esempio nella formula sulla diapositiva 16 e risolverlo.

  1. Nel tuo caso, prendiamo ɑ essere:

    Chicago Pizza   cheese  cheese
    Chicago Pizza   cheese  supreme
    Chicago Pizza   supreme cheese
    Chicago Pizza   supreme supreme
    Dominos         cheese  cheese
    Dominos         cheese  supreme
    
  2. Quindi prendiamo β essere:

    cheese cheese
    cheese supreme
    supreme cheese
    supreme supreme
    
  3. Il risultato di ɑ / β Sarebbe quindi:

    Chicago Pizza
    

Dominos non fa parte di questo perché manca (supreme cheese) e (supreme supreme).

Prova a fare un join usando condizioni piuttosto che una croce. Le condizioni sarebbero sicure di abbinare correttamente i record (li includi solo se si trovano in entrambe le relazioni) piuttosto che abbinare ogni record nella prima relazione con ogni record nella seconda relazione.

Questa è l'annotazione di un'altra risposta. Il mio cervello mi faceva male e quindi ho provato una risposta concisa e completa pubblicata in precedenza e ha funzionato. Ma questo è semplicemente "dare a un uomo un pesce" e quindi ho dovuto vedere cosa c'era dietro.

Ecco quindi la soluzione di Chrischen3121 del 22 gennaio 14 con cambiamenti solo tra parentesi, commenti e pause di linea. La maggior parte della parentesi si allinea in verticale con la loro partita. Spero che ciò semplifica le cose. Seguendo il codice esteticamente riscritto, ci sono le relazioni intermedie prodotte nel tentativo di visualizzare/concettualizzare la soluzione.

Per farla breve:

-Find Pizze target;

--con Cross, costruisci un elenco di super set fantasy come se tutte le pizzerie servivano dette torte;

-Stuprare da lì, tutte torte "effettivamente servite" per creare un elenco "questi-a-missing";

-Finalmente, da [una nuova copia di] "realtà", sottrai la "scomparsa" e ... questo è tutto.

\project_{pizzeria}(Serves)// “Actual” list of what pizzerias serve. Results shown below. 
\diff
\project_{pizzeria}
(// After the diff, this is a list of "What's Missing". Results shown below
    (// Super-set of all pizzerias combined with all "over30pies". Results shown below 
     // NOTE: Some combos here do not match reality
        \project_{pizzeria}(Serves)
        \cross
        (// "over30pies": Within these parentheses produces table shown below
            //Next line is what I used, it’s effectively equivalent, yes.
            //roject_{pizza} (                \select_{age > 30 }  Person  \join Eats)
            \project_{pizza} (\project_{name}(\select_{age > 30 } (Person))\join Eats)
        )
    )
    \diff
    ( // “Actual” list of what pizzerias serve. Results shown below. 
        \project_{pizzeria,pizza}(Serves)
    )
)

// "over30pies", Target Pies (quelle mangiate da oltre 30 anni)

cheese 
supreme

// Super-set di tutte le pizzerie combinate con tutti i bersaglio ("over30pies") // Nota: alcune combo non corrispondono alla realtà.

Chicago Pizza | cheese
Chicago Pizza | supreme
Dominos | cheese
Dominos | supreme
Little Caesars | cheese
Little Caesars | supreme
New York Pizza | cheese
New York Pizza | supreme
Pizza Hut | cheese
Pizza Hut | supreme
Straw Hat | cheese
Straw Hat | supreme

// ELENCO ELENCO COMPLETO DI cui le pizzerie servono effettivamente cosa

Chicago Pizza | cheese
Chicago Pizza | supreme
Dominos | cheese
Dominos | mushroom
Little Caesars | cheese
Little Caesars | mushroom
Little Caesars | pepperoni
Little Caesars | sausage
New York Pizza | cheese
New York Pizza | pepperoni
New York Pizza | supreme
Pizza Hut | cheese
Pizza Hut | pepperoni
Pizza Hut | sausage
Pizza Hut | supreme
Straw Hat | cheese
Straw Hat | pepperoni
Straw Hat | sausage

// Differenza (ciò che è rimasto) dopo che "effettivo" viene sottratto dal fantastico "super-set". Questo quindi rappresenta ciò che manca o, "Queste pizzeria non servono la pizza richiesta elencata"

Dominos | supreme
Little Caesars | supreme
Straw Hat | supreme

Sulla base del presupposto che tutte le pizzerie servono almeno un tipo di pizza, scopriremo che il gruppo di pizze che le persone di età superiore ai 30 anni non mangiano saranno vendute da tutte le pizzerie tranne quelle che vendono esclusivamente pizze che persone 30 Mangia. Ha aiutato?

Ecco la conversione di http://oracletoday.blogspot.com/2008/04/relational-algebra-division-in-sql.htmla mysql

    mysql>create table parts (pid integer);
    mysql>create table catalog (sid integer,pid integer);
    mysql>insert into parts values ( 1), (2), (3), (4), (5);
    mysql>insert into catalog values (10,1);

mysql>select * from catalog;
+------+------+
| sid  | pid  |
+------+------+
|   10 |    1 |
|    1 |    1 |
|    1 |    2 |
|    1 |    3 |
|    1 |    4 |
|    1 |    5 |
+------+------+


mysql> select distict sid,pid from (select sid from catalog) a  join parts;
+------+------+
| sid  | pid  |
+------+------+
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    4 |
|   10 |    5 |
|    1 |    1 |
|    1 |    2 |
|    1 |    3 |
|    1 |    4 |
|    1 |    5 |
+------+------+


mysql>select * from 
(select distinct sid,pid from (select sid from catalog) a ,parts)  b where
not exists (select 1 from catalog c where b.sid = c.sid and b.pid = c.pid);

+------+------+
| sid  | pid  |
+------+------+
|   10 |    2 |
|   10 |    3 |
|   10 |    4 |
|   10 |    5 |
+------+------+


mysql>select distinct sid from catalog c1
where not exists (
   select null from parts p
   where not exists (select null from catalog where pid=p.pid and c1.sid=sid));
+------+
| sid  |
+------+
|    1 |
+------+

Ho capito di seguito in base al wiki.

R: = project_ {pizzeria, pizza} ( select_ {age> 30} (persona join eats join serve))

S: = project_ {pizza} ( select_ {age> 30} (persona join eats join serve))

Soluzione finale:

project_ {pizzeria} ( project_ {pizzeria, pizza} ( select_ {age> 30} (persona join eats join serves)))

Diff

( Project_ {Pizzeria} (( Project_ {Pizzeria} ( Project_ {Pizzeria, Pizza} ( Select_ {Age> 30} (persona join eats join servs)) cross project_ {pizza} ( select_ {age> 30} (persona join eats join serves))) diff ( project_ {pizzeria, pizza} ( select_ {age> 30} (persona join eats join serves))))))))))

Ciao ho trovato una soluzione senza dividere l'operatore:

\project_{pizzeria}Serves
\diff
\project_{pizzeria}((\project_{pizza}(\select_{age < 30}Person\joinEats)
\diff\project_{pizza}(\select_{age > 30}Person\joinEats))\joinServes);

========================================================================

E 'così semplice. Cosa ho fatto? Nella seconda parte ho trovato la lista delle pizze che non includevano le pizze che vengono mangiate da quelle sopra 30.

Mi sono unito a loro con le pizzerie per vedere quali pizzerie fanno anche la pizza per i giovani.

Mi sono differeto dal fatto che dall'elenco originale delle pizzerie e l'unica che produce pizza per quelle sopra 30 è la pizza di Chicago.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top