es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

cómo separar elementos agrupados en sqlite3 a través de python

He empezado a utilizar una base de datos para mi programa en lugar de archivos .txt y me gustaría hacer una función de búsqueda.

Ya tengo la idea básica de la función de búsqueda (menú desplegable con todas las opciones posibles), pero con la mayoría de los elementos hay múltiples elementos en 1 columna/fila, por ejemplo:

columna “nombre_comida” “Ingredientes” “receta”

           patata gratinada    patata, queso, etc.

Pero en mi función de búsqueda, “patata, queso” es un elemento, ¿cómo puedo separarlo?

Y mi segunda pregunta, obviamente va a haber alimentos con ingredientes similares, ¿cómo puedo evitar que muestre múltiples veces el mismo ingrediente y aún así mostrar el resultado de todos los alimentos con el mismo ingrediente?

Opción 1 tiene queso seleccionado, Opción 2 tiene patata y queso seleccionados (pero quiero que estén separados), Opción 3 en la parte superior muestra queso y en la parte inferior muestra queso (de 2 alimentos diferentes) y quiero tener solo 1 instancia de ese ingrediente pero mostrar todos los alimentos con ese ingrediente

from tkinter import *
from tkinter.ttk import Combobox
import sqlite3

con = sqlite3.connect("Food.db")
c = con.cursor()

c.execute("SELECT Ingredients FROM Dinner_Order")
order = c.fetchall()
c.execute("SELECT Ingredients FROM Dinner_Stove")
stove = c.fetchall()
c.execute("SELECT Ingredients FROM Dinner_Oven")
oven = c.fetchall()
c.execute("SELECT Ingredients FROM Dinner_Cold")
cold = c.fetchall()
c.execute("SELECT Ingredients FROM Dinner_Simple")
simple = c.fetchall()
con.commit()

dinner_order = order
dinner_stove = stove
dinner_oven = oven
dinner_cold = cold
dinner_simple = simple

ws = Tk()
ws.title("Guías de Python")
ws.geometry("200x200")

item_names = dinner_order + dinner_stove + dinner_oven + dinner_simple + dinner_cold

combo = Combobox(ws, state='readonly')
combo['values'] = item_names
combo.pack()

combo = Combobox(ws, state='readonly')
combo['values'] = item_names
combo.pack()

combo = Combobox(ws, state='readonly')
combo['values'] = item_names
combo.pack()

combo = Combobox(ws, state='readonly')
combo['values'] = item_names
combo.pack()

button = Button(ws, text="buscar")#command=search_items)
button.pack()

ws.mainloop()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución

    Para separar los múltiples elementos de una columna, puedes usar un separador como una coma o un punto y coma. Por ejemplo, en la columna “Ingredientes”, puedes separar los ingredientes con una coma como “patata, queso, etc.”

    Para buscar alimentos con ingredientes similares y evitar mostrar duplicados, puedes usar la palabra clave DISTINCT en tu consulta de búsqueda. Esto te devolverá una lista de ingredientes únicos sin duplicados.

    Aquí tienes una versión actualizada de tu código que incluye una función de búsqueda que separa los ingredientes y evita los duplicados:

    from tkinter import *
    from tkinter.ttk import Combobox
    import sqlite3
    
    con = sqlite3.connect("Food.db")
    c = con.cursor()
    
    c.execute("SELECT Ingredients FROM Dinner_Order")
    order = c.fetchall()
    c.execute("SELECT Ingredients FROM Dinner_Stove")
    stove = c.fetchall()
    c.execute("SELECT Ingredients FROM Dinner_Oven")
    oven = c.fetchall()
    c.execute("SELECT Ingredients FROM Dinner_Cold")
    cold = c.fetchall()
    c.execute("SELECT Ingredients FROM Dinner_Simple")
    simple = c.fetchall()
    con.commit()
    
    dinner_order = [row[0].split(', ') for row in order]
    dinner_stove = [row[0].split(', ') for row in stove]
    dinner_oven = [row[0].split(', ') for row in oven]
    dinner_cold = [row[0].split(', ') for row in cold]
    dinner_simple = [row[0].split(', ') for row in simple]
    
    item_names = [item for sublist in (dinner_order + dinner_stove + dinner_oven + dinner_simple + dinner_cold) 
                  for item in sublist]
    ingredients = list(set(item_names))
    
    ws = Tk()
    ws.title("Python Guides")
    ws.geometry("200x200")
    
    combo1 = Combobox(ws, state='readonly')
    combo1['values'] = ingredients
    combo1.pack()
    
    combo2 = Combobox(ws, state='readonly')
    combo2['values'] = ingredients
    combo2.pack()
    
    combo3 = Combobox(ws, state='readonly')
    combo3['values'] = ingredients
    combo3.pack()
    
    combo4 = Combobox(ws, state='readonly')
    combo4['values'] = ingredients
    combo4.pack()
    
    def search_items():
        ingredient1 = combo1.get()
        ingredient2 = combo2.get()
        ingredient3 = combo3.get()
        ingredient4 = combo4.get()
    
        c.execute(f"""SELECT DISTINCT Food_Name FROM 
                    (SELECT Food_Name, Ingredients FROM Dinner_Order 
                    UNION ALL SELECT Food_Name, Ingredients FROM Dinner_Stove
                    UNION ALL SELECT Food_Name, Ingredients FROM Dinner_Oven 
                    UNION ALL SELECT Food_Name, Ingredients FROM Dinner_Cold 
                    UNION ALL SELECT Food_Name, Ingredients FROM Dinner_Simple) 
                    WHERE Ingredients LIKE '%{ingredient1}%' 
                    AND Ingredients LIKE '%{ingredient2}%' 
                    AND Ingredients LIKE '%{ingredient3}%' 
                    AND Ingredients LIKE '%{ingredient4}%'""")
    
        results = c.fetchall()
        print(results)
    
    button = Button(ws, text="buscar", command=search_items)
    button.pack()
    
    ws.mainloop()
    

    Este código separa los ingredientes por una coma, los agrega a una lista y luego crea otra lista con ingredientes únicos usando la función set().

    En la función search_items(), la consulta SQL utiliza el operador LIKE para encontrar los alimentos que contienen los cuatro ingredientes seleccionados. La palabra clave DISTINCT devuelve solo los nombres de alimentos únicos.

    ¡Espero que esto te ayude!

Comments are closed.