Domanda

EDIT:

Mi hanno detto che facendo voi ragazzi leggere mezzi ricevo meno attenzione. Mie scuse. Ecco una versione più semplice:

Bill ottenuto $ 100 dollari vale la pena di elementi da un negozio.

Si vuole tornare a sufficienza degli elementi per ottenere esattamente $ 30 dollari di nuovo.

Il negozio ha un punto del sistema di ritorno che lo aiuterà a fare questo.

Ecco i dati dopo che analizza i suoi elementi:

       item ¦   price ¦

socks             4.00
cheap tv         22.00
book on tape      9.00
book on paper     7.00
party hats        3.00
picture frame    10.00
hammer            5.00
juicer           16.00
mysql guide      24.00

total items  ¦ total price ¦
            9   100.00

Option 1
===============
item ¦          price ¦
cheap tv        22.00
party hats       3.00
hammer           5.00
===============

Option 2
===============
item ¦          price ¦

socks            4.00
picture frame   10.00
juicer          16.00
===============

Option 3
===============
item ¦          price ¦

book on tape    9.00
hammer          5.00
juicer         16.00

Probabilmente ho perso un paio di opzioni, da quando ho fatto tutto questo in su.

Così, la grande domanda è:

C'è un modo (con GROUP BY, probabilmente) di avere una query che sarebbe tornato mai possibile combinazione di elementi?

Grazie!

a

È stato utile?

Soluzione

Se il numero di elementi sono abbastanza piccolo si può Brute Force questo con SQL. Questa potrebbe essere una rapida soluzione di scrivere, ma probabilmente vogliono fare qualcosa di più intelligente. Suona come il " zaino problema ", che è NP completo.

Se il numero di elementi è di grandi dimensioni, sarà necessario approfondire algoritmi di programmazione dinamici. Bisogna chiedersi quanto questo sia importante per la vostra applicazione.

Se il numero di elementi è relativamente piccolo, si può essere in grado di forza bruta questo. Una dichiarazione forza bruta SQL (che è quello che avete chiesto) che trova le combinazioni di 1,2 o 3 voci che corrispondono è la seguente. Se questo non è soddisfacente, allora forse SQL non è lo strumento giusto per questo lavoro.

SELECT
   i1.id AS id1,
   NULL AS id2,
   NULL AS id3,
   i1.amount
FROM
   items i1
UNION ALL
SELECT
   i1.id AS id1,
   i2.id AS id2,
   i3.id AS id3,
   i1.amount + i2.amount AS total
FROM
   items i1,
   items i2
WHERE
   i1.amount + i2.amount = 30 AND
   i1.id <> i2.id AND
   i1.id <> i3.id
UNION ALL
SELECT
   i1.id AS id1,
   i2.id AS id2,
   i3.id AS id3,
   i1.amount + i2.amount + i3.amount AS total
FROM
   items i1,
   items i2,
   items i3
WHERE
   i1.amount + i2.amount + i3.amount = 30 AND
   i1.id <> i2.id AND
   i1.id <> i3.id AND
   i2.id <> i3.id

In Oracle, si può usare la funzione CUBE per trasformare questo in una versione generica, non sono sicuro di un MySQL equivalente.

Altri suggerimenti

Stai chiedendo tutti i sottoinsiemi che corrisponde esattamente a $ 30.

Questo suona un po 'come il sottoinsieme somma problema , e problema dello zaino , quindi dubito fortemente che si può fare questo con una semplice query. Probabilmente avrebbe dovuto rivolgersi a T-SQL, ma anche questo sarebbe probabilmente sembrare brutto.

Credo che la programmazione è il modo di andare qui.

Non credo gruppo da può farlo.

Non riesco a pensare ad un modo migliore di trovare / cercare tutte le permutazioni, sia nel linguaggio di programmazione di scelta o con una stored procedure.

se si ha più di 30 articoli $ si poteva omettere.

ci sarebbero alcuni miglioramenti se si voleva un'opzione "migliore" di alcuni criteri.

Il problema è infatti P / NP. ad esempio, è probabile che non possono trovare i migliori prezzi dei prodotti di montaggio, senza ricerca di forza bruta, e se il tuo negozio i clienti è grande - è possibile trovare che la ricerca molto lunga durata.

È possibile utilizzare alcuni degli algoritmi esistenti che si possono dare abbastanza buona congettura, ma ho paura che essi sono tutti quelli non-SQL.

Vorrei suggerire di fare approssimazione del problema:

Crea procedura / interrogazione che trova un articolo che meglio si adatta prezzo voluto, e poi chiamare di nuovo per nuovo cambiamento che avete. Non perfetto, ma farà il lavoro.

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