Két különböző adatbázis adatainak összehasonlítása

Sziasztok!

A következőre kérnék segítséget:

Van 2 adatbázis tábla (két külön adatbázisban).
Az 'A' tábla mail oszlopot tartalmaz, a 'B' tábla pedig mail és active oszlopokat.

Azt kellene megoldanom, hogy csak azokat az emaileket listázza ki az 'A' táblából, amik nincsenek a 'B' táblában sem aktív állapotban, se másképp.

Ti, hogy oldanátok ezt meg?

Íme a jelenlegi kód:
$stmt =$dbh->prepare('SELECT mail, status, created FROM tegyjot_commerce_order WHERE status="completed"');
$stmt ->execute();
$rows=$stmt->fetchAll();
$stmtwg =$dbhwg->prepare('SELECT mail, active FROM wg4_users');
$stmtwg ->execute();
$rowswg=$stmtwg->fetchAll();

Előre is köszönöm!

Hozzászólások

Ha már úgyis leszeded kompletten a két táblát, miért nem teszed be egy közös db-be és oldod meg az egészet kódolás nélkül egy sql-lel?

ha egy szerveren van, es adott usernek van joga olvasni a tablakat, akkor sima join. select from db1.table1 join db2.table2 ...

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Azt nem mondtad, hogy milyen méretűek az adatbázisok, bár ahogy nézem a jelenlegi kódot, most kb. mindent betolsz a memóriába és ott nézed. Ha ez esetleg már túl nagyra nőne, akkor lehet oszd-meg-és-uralkodj elven hash-t képezni a szövegekből, és mondjuk mindig csak az 'aa', 'ab', 'ac'... -val kezdődő hash-eket összehasonlítani.
--
#startup: Astro Teller: Mihez kezdjünk a nagy ötlettel?

1) ha az elso query-ben csak a mail kell, felesleges a status-t is leszedned. Condition-ben hasznalhasz olyan fieldet is, amit amugy nem akarsz a resultsetben latni.

2) En azt csinalnam, hogy eloszednem a mailokat a db2-bol, osszerendeznem oket egy sima array-be, majd beadagolnam a db1-nek, valahogy igy:


$stmt = $dbhwg->prepare("SELECT mail FROM wg4_users WHERE active = 0");
$mails = array();
while($row = $stmt->fetch()) {
  $mails[] = $row['mail'];
}

$stmt = $dbh->prepare("SELECT mail, status, created FROM tegyjot_commerce_order WHERE status = 'completed' AND NOT FIELD_IN_SET(mail, ?)");
$stmt->execute(implode(",", $mails));

A resultsetbol elo lehet szedni a hianyzo megrendeleseket.

A masik (mivel nekem van hatterinfom, en tudom, hogy valojaban mi ez, es ez csalas a tobbiekkel szemben, de ez van), hogy en inkabb onnet kozelitenem meg a kerdest, hogy a D8 commerce-ben az order akkor legyen completed, amikor atkerult a wg4_users-be, addig maradjon pending. Eleve, fizetes utan az pending lesz, ha jol emlekszem, mert a completed order statusz annak jelzesere vonatkozik, hogy a megrendeles teljesitve van. Logikailag pedig ebben az esetben az order akkor lesz completed, amikor a mail beszurasra kerul a wg4_users-be.

Ekkor az egesz leegyszerusodik arra, hogy le kell selectelni az osszes pending ordert.

PS: ha pedig a hirlevelre feliratkozas csak egy vegso allapot, akkor pedig kell egy koztes allapot is. Ehhez annyi hintet tudok adni, hogy a D8-ba fel lehet vinni plusz allapotokat az orderhez, es ekkor arra allitod at. Egy nem teljesen elrugaszkodott pelda az, amikor csomagot rendel valaki, akkor ugye a pending-bol nem rogton lesz complete, hanem elobb lesz shipping allapotja is neki.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Remélem jól értem mit szeretnél:

select a.*
from wg4_users a
left join tegyjot_commerce_order b
on a.mail=b.mail
where b.mail is null

A wg_users -es select -nel nem rakod idezojelbe a $row['mail'] -t. Az pedig fontos.

Ja, es SQL-nel szokj ra arra, hogy szimpla idezojelet hasznalunk belul, es az egesz query-t duplaba rakjuk. Ez foleg azert jo, mert akkor ki lehet hasznalni a valtozo-behelyettesitest is ( WHERE "mail = '{$row['mail']}'").
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal