# SQL-lekérdezés generálása AI-val

> Az SQL/AI lekérdezés Haladó/AI módja: a varázspálca, jó kérések írása, az eredmény típuskényszerítése, születésnapok és készleten lévő termékkategóriák példája.

Az **SQL/AI lekérdezés** típusnál adatbázis-lekérdezést (SQL) generáltathatsz AI-val. Így megtalálhatod például azokat a felhasználókat, akik az elmúlt két hétben közzétettek bejegyzést, kiírhatod a készleten lévő termékek kategóriáit, vagy a héten megjelent bejegyzéseket. A kéréseket (prompt) természetes nyelven írod le.

![Az SQL/AI lekérdezés beállításai: Haladó/AI mód, tábla, Join, Where, rendezés, limit, oszlopok](./kepek/query-builder-sql-halado.webp)

*Az SQL/AI lekérdezés beállításai: Haladó/AI mód, tábla, Join, Where, rendezés, limit, oszlopok* (https://minta-bolt.hu/wp-admin/admin.php?page=jet-engine-query&query_action=add)

Az SQL/AI lekérdezés beállításai a képen láthatók. A **Haladó/AI mód** kapcsoló az alapbeállításokat kapcsolja ki, és engedi, hogy az SQL-lekérdezést kézzel vagy AI-val írd meg.

## Az AI használatának feltételei

- Az AI-funkció csak azokra az előfizetésekre érhető el, amelyek tartalmazzák a JetEngine-t. A kérések száma korlátozott, a korlát az azonos licenckulcsot használó összes oldalra együtt vonatkozik, és csak a fő kulccsal működik, a részkulcsokkal nem.
- A generáláshoz a **Crocoblock → Licenc** oldalon a fő licenckulcsnak aktívnak kell lennie.
- Az AI-val bármelyik nyilvános AI-csevegőből is készíthetsz SQL-t, és bemásolhatod.
- Minden generálás, a példakérések kipróbálása is, egy kérésnek számít, ezért csak átgondolt kéréssel indítsd.

## A generálás lépései

1. A **JetEngine → Lekérdezéskészítő → Új hozzáadása** oldalon add meg a nevet, és a **Lekérdezés típusa** legyen **SQL/AI lekérdezés**. A leírás és az egyéni lekérdezés-ID opcionális.
2. Kapcsold be a **Haladó/AI mód** kapcsolót.
3. Az **SQL-lekérdezés** szövegmező jobb felső sarkában kattints a varázspálca ikonra. Megnyílik a **Generate query with AI** ablak, benne a **Describe your query** mezővel, tippekkel a jó kérés megfogalmazásához és kattintható példakérésekkel.
4. Írd le, milyen adatot szeretnél, vagy kattints egy példakérésre, és módosítsd.
5. Kattints a **Generate query** gombra. A folyamat néhány másodperctől egy percig tart.
6. A generált SQL a szövegmezőben jelenik meg. Ha másikat szeretnél, új kéréssel kattints a **Generate new query** gombra.
7. Ellenőrizd az SQL-t, majd kattints a **Use this query** gombra: a lekérdezés bekerül az **SQL-lekérdezés** mezőbe, ahol tovább szerkesztheted.
8. Az **Eredmények előnézete** kapcsolóval nézd meg az eredményt.

A generált lekérdezés nem mindig pontos, ezért mindig nézd át. Például a `WHERE m.meta_key = 'birth_date'` sorban a `birth_date` csak alapértelmezett érték: írd át a saját meta meződ slugjára.

### Jó kérés írása

- Úgy fogalmazz, ahogy az SQL-lekérdezést magad is felépítenéd: bontsd részekre a feladatot.
- A kérés legfeljebb 400 karakter lehet. Minél hosszabb, annál nehezebben érti az AI.
- Említsd meg, melyik tárolási táblát és meta kulcsot használja, ha ismered (például a készletállapot a `_stock_status` meta kulcsban van).
- Ha az aktuális bejegyzés azonosítója kell, írd le, hogy azt a `%current_id%` makró adja.
- Kérd, hogy csak egyedi kifejezéseket (unique terms) adjon, és az összes adatot a kifejezések táblájából.

## Az eredmény típuskényszerítése

Az **Eredmény típuskényszerítése objektumpéldányra** beállítás az SQL által visszaadott alapértelmezett PHP-objektumokat (alapértelmezés: stdClass megtartása) alakítja át a kívánt típusra: bejegyzés, felhasználó, kifejezés és így tovább. Ez a bejegyzés- vagy felhasználótípushoz igazított widgeteknél megelőzi a hibákat, és az objektum összes mezőjét elérhetővé teszi.

## Példa: a hónap hátralévő születésnapjai

Cél: azok a felhasználók, akiknek a születésnapja az aktuális hónapban a mai napon vagy később van.

1. Hozz létre felhasználókhoz kötött meta boxot egy **Date** típusú mezővel, majd töltsd ki a felhasználóknál.
2. Hozz létre SQL/AI lekérdezést, kapcsold be a **Haladó/AI módot**, és generáld a kéréssel: „Get users who have birthday on current month. Birthday is stored in the meta field with meta key ‘birth_date’. Return only future birthdays and all data from the users table.”
3. A generált SQL-ben cseréld a `birth_date` értéket a saját mező slugjára.
4. Az **Eredmény típuskényszerítése objektumpéldányra** listában válaszd a **User** (Felhasználó) értéket.
5. Mentsd a lekérdezést.
6. A **JetEngine → Listázások/komponensek** oldalon az **Új elem hozzáadása** gombbal hozz létre listázási elemet. A forrás **Users** vagy **Query Builder** lehet; ha **Query Builder**, a lekérdezést is meg kell adnod. A **Users** forrás a sablon szerkesztése közben jobb az előnézethez.
7. A sablonban **Dynamic Field** widgettel jelenítsd meg az adatokat. A WordPress alap felhasználói mezőihez a **Post/Term/User/Object Data** forrást használd, a JetEngine egyéni mezőihez a **Meta Data** forrást.
8. A születésnap dátuma alapértelmezetten ÉÉÉÉ-HH-NN formátumú (például „1980-04-21”). Csak a nap és a hónap kiírásához kapcsold be a **Filter field output** kapcsolót, válaszd a **Format date** callbacket, és a formátum legyen `F j`.
9. A **Listing Grid** elemben válaszd ki a sablont. Query Builder forrásnál azonnal látszik az eredmény. Users forrásnál a **Custom Query** fülön kapcsold be a **Use Custom Query** kapcsolót, és válaszd ki a lekérdezést.

## Példa: készleten lévő termékek kategóriái (WooCommerce)

Követelmény: WooCommerce termékekkel és termékkategóriákkal.

1. Hozz létre SQL/AI lekérdezést, és kapcsold be a **Haladó/AI módot**.
2. Használd a kérést: „WooCommerce. Select product categories with products in stock. Product stock status is stored in ‘_stock_status’ meta field. Return only unique terms and all data from terms table.”
3. A **Use this query** gomb után kapcsold be az **Eredmények előnézete** kapcsolót.

Az eredményben csak négy tulajdonság van (`term_id`, `name`, `slug`, `term_group`). A **Dynamic Field** csak ezeket kínálja; a kategória bélyegképe vagy a meta mezők nem érhetők el. Ha az összes mező kell, az **Eredmény típuskényszerítése objektumpéldányra** listában válaszd a **Taxonomy Term** értéket.

### Összetettebb kérések

- „WooCommerce. Select only first-level product categories. Return only unique terms and all data from terms table.” Az eredmény az, amelynek a `parent` oszlopa 0.
- Az aktuális termék másodszintű kategóriáihoz, például a Ruházat › Női kollekciók › Tavaszi kollekció fából a „Női kollekciók” kapcsán: „WooCommerce. Select only second-level product categories of the current product. The parent product category of the returned product categories should not have a parent category. The ID of the current product is retrieved with %current_id% macro. Return only unique terms and all data from terms table.” A generált SQL-ből az `AND tt.parent != 0;` sor törölhető, mert felesleges.

## Az eredmény megjelenítése

Két módszer van:

- **Új sablon Query Builder forrással.** A **Listázások/komponensek** oldalon új sablon, a forrás **Query Builder**, a lekérdezés az SQL-lekérdezés. Ez kötelező, ha nem használtad a típuskényszerítést. A sablonban a **Dynamic Field** **Post/Term/User/Object Data** forrásánál az **Object Field** listából a „Term name” értéket választva kiírhatod a kategória nevét. A kategória bélyegképéhez **Dynamic Image** widgetet tegyél be, és a **Custom meta field/repeater key** mezőbe írd: `thumbnail_id`.
- **Kész sablon a Listing Gridben**, típuskényszerített lekérdezéssel.

A Listing Grid ezután a sablont kéri; ha a sablon forrása a Query Builder, a **Custom Query** fülön nem kell újra megadnod a lekérdezést.
